summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSteve Kondik <steve@cyngn.com>2015-12-08 03:28:20 -0800
committerSteve Kondik <steve@cyngn.com>2015-12-08 03:28:20 -0800
commitc20f2cc6ed871459a6e0b4ebbeaeffb7675290b3 (patch)
tree6f4b15fceaefeb5a24fc139326fa587127b0a769
parente79d278402c4cd4b36ad27ae164ac8d10e899c76 (diff)
parent1ce7fe6b0a887edc6fad8e3386ab8e28a5f0d107 (diff)
downloadhardware_libhardware-c20f2cc6ed871459a6e0b4ebbeaeffb7675290b3.zip
hardware_libhardware-c20f2cc6ed871459a6e0b4ebbeaeffb7675290b3.tar.gz
hardware_libhardware-c20f2cc6ed871459a6e0b4ebbeaeffb7675290b3.tar.bz2
Merge tag 'android-6.0.1_r3' of https://android.googlesource.com/platform/hardware/libhardware into HEAD
Android 6.0.1 release 3 Change-Id: I8d2fae05954594f003fc2506fc123147e70c3602
-rw-r--r--include/hardware/sensors.h2
-rw-r--r--modules/audio_remote_submix/audio_hw.cpp68
2 files changed, 41 insertions, 29 deletions
diff --git a/include/hardware/sensors.h b/include/hardware/sensors.h
index 3f45fb9..51bffe1 100644
--- a/include/hardware/sensors.h
+++ b/include/hardware/sensors.h
@@ -147,7 +147,7 @@ enum {
* Counter sensors can be set with this flag and SensorService will inject accelerometer data
* and read the corresponding step counts.
*/
- SENSOR_FLAG_SUPPORTS_DATA_INJECTION = 0x10 // 1000
+ SENSOR_FLAG_SUPPORTS_DATA_INJECTION = 0x10 // 1 0000
};
/*
diff --git a/modules/audio_remote_submix/audio_hw.cpp b/modules/audio_remote_submix/audio_hw.cpp
index 58bc4a2..515f150 100644
--- a/modules/audio_remote_submix/audio_hw.cpp
+++ b/modules/audio_remote_submix/audio_hw.cpp
@@ -179,7 +179,8 @@ struct submix_stream_out {
struct submix_audio_device *dev;
int route_handle;
bool output_standby;
- uint64_t write_counter_frames;
+ uint64_t frames_written;
+ uint64_t frames_written_since_standby;
#if LOG_STREAMS_TO_FILES
int log_fd;
#endif // LOG_STREAMS_TO_FILES
@@ -700,7 +701,7 @@ static int out_standby(struct audio_stream *stream)
pthread_mutex_lock(&rsxadev->lock);
out->output_standby = true;
- out->write_counter_frames = 0;
+ out->frames_written_since_standby = 0;
pthread_mutex_unlock(&rsxadev->lock);
@@ -855,7 +856,8 @@ static ssize_t out_write(struct audio_stream_out *stream, const void* buffer,
pthread_mutex_lock(&rsxadev->lock);
sink.clear();
if (written_frames > 0) {
- out->write_counter_frames += written_frames;
+ out->frames_written_since_standby += written_frames;
+ out->frames_written += written_frames;
}
pthread_mutex_unlock(&rsxadev->lock);
@@ -871,30 +873,31 @@ static ssize_t out_write(struct audio_stream_out *stream, const void* buffer,
static int out_get_presentation_position(const struct audio_stream_out *stream,
uint64_t *frames, struct timespec *timestamp)
{
- const submix_stream_out * out = reinterpret_cast<const struct submix_stream_out *>
- (reinterpret_cast<const uint8_t *>(stream) -
- offsetof(struct submix_stream_out, stream));
+ if (stream == NULL || frames == NULL || timestamp == NULL) {
+ return -EINVAL;
+ }
+
+ const submix_stream_out *out = audio_stream_out_get_submix_stream_out(
+ const_cast<struct audio_stream_out *>(stream));
struct submix_audio_device * const rsxadev = out->dev;
- int ret = 0;
+ int ret = -EWOULDBLOCK;
pthread_mutex_lock(&rsxadev->lock);
-
- if (frames) {
- const ssize_t frames_in_pipe =
- rsxadev->routes[out->route_handle].rsxSource->availableToRead();
- if (CC_UNLIKELY(frames_in_pipe < 0)) {
- *frames = out->write_counter_frames;
- } else {
- *frames = out->write_counter_frames > (uint64_t) frames_in_pipe ?
- out->write_counter_frames - frames_in_pipe : 0;
- }
+ const ssize_t frames_in_pipe =
+ rsxadev->routes[out->route_handle].rsxSource->availableToRead();
+ if (CC_UNLIKELY(frames_in_pipe < 0)) {
+ *frames = out->frames_written;
+ ret = 0;
+ } else if (out->frames_written >= (uint64_t)frames_in_pipe) {
+ *frames = out->frames_written - frames_in_pipe;
+ ret = 0;
}
- if (timestamp) {
+ pthread_mutex_unlock(&rsxadev->lock);
+
+ if (ret == 0) {
clock_gettime(CLOCK_MONOTONIC, timestamp);
}
- pthread_mutex_unlock(&rsxadev->lock);
-
SUBMIX_ALOGV("out_get_presentation_position() got frames=%llu timestamp sec=%llu",
frames ? *frames : -1, timestamp ? timestamp->tv_sec : -1);
@@ -904,15 +907,26 @@ static int out_get_presentation_position(const struct audio_stream_out *stream,
static int out_get_render_position(const struct audio_stream_out *stream,
uint32_t *dsp_frames)
{
- if (!dsp_frames) {
+ if (stream == NULL || dsp_frames == NULL) {
return -EINVAL;
}
- uint64_t frames = 0;
- int ret = out_get_presentation_position(stream, &frames, NULL);
- if ((ret == 0) && dsp_frames) {
- *dsp_frames = (uint32_t) frames;
+
+ const submix_stream_out *out = audio_stream_out_get_submix_stream_out(
+ const_cast<struct audio_stream_out *>(stream));
+ struct submix_audio_device * const rsxadev = out->dev;
+
+ pthread_mutex_lock(&rsxadev->lock);
+ const ssize_t frames_in_pipe =
+ rsxadev->routes[out->route_handle].rsxSource->availableToRead();
+ if (CC_UNLIKELY(frames_in_pipe < 0)) {
+ *dsp_frames = (uint32_t)out->frames_written_since_standby;
+ } else {
+ *dsp_frames = out->frames_written_since_standby > (uint64_t) frames_in_pipe ?
+ (uint32_t)(out->frames_written_since_standby - frames_in_pipe) : 0;
}
- return ret;
+ pthread_mutex_unlock(&rsxadev->lock);
+
+ return 0;
}
static int out_add_audio_effect(const struct audio_stream *stream, effect_handle_t effect)
@@ -1404,8 +1418,6 @@ static int adev_open_output_stream(struct audio_hw_device *dev,
out->stream.get_next_write_timestamp = out_get_next_write_timestamp;
out->stream.get_presentation_position = out_get_presentation_position;
- out->write_counter_frames = 0;
-
#if ENABLE_RESAMPLING
// Recreate the pipe with the correct sample rate so that MonoPipe.write() rate limits
// writes correctly.