From 7076f48493d57f39cb50c35cc2b12626ba210962 Mon Sep 17 00:00:00 2001 From: Kyle Repinski Date: Mon, 1 Dec 2014 23:57:59 -0600 Subject: audio: Add ability to disable built-in out stream resample. This needs further testing before enabling by default, but so far it's been OK. Conflicts: audio/audio_hw.c Change-Id: Ic4f86440ff4d01ab4d0d9f977bdec22f10f60555 --- audio/Android.mk | 3 +++ audio/audio_hw.c | 22 ++++++++++++++++++++++ 2 files changed, 25 insertions(+) (limited to 'audio') diff --git a/audio/Android.mk b/audio/Android.mk index bdb47de..eed0c27 100644 --- a/audio/Android.mk +++ b/audio/Android.mk @@ -27,5 +27,8 @@ LOCAL_C_INCLUDES += \ LOCAL_SHARED_LIBRARIES := liblog libcutils libtinyalsa libaudioutils libdl libsecril-client LOCAL_MODULE_TAGS := optional +# Comment to disable out stream resampler. +LOCAL_CFLAGS += -DOUT_RESAMPLER + include $(BUILD_SHARED_LIBRARY) diff --git a/audio/audio_hw.c b/audio/audio_hw.c index ba8a81d..45f4c44 100644 --- a/audio/audio_hw.c +++ b/audio/audio_hw.c @@ -678,8 +678,10 @@ struct tuna_stream_out { pthread_mutex_t lock; /* see note below on mutex acquisition order */ struct pcm_config config[PCM_TOTAL]; struct pcm *pcm[PCM_TOTAL]; +#ifdef OUT_RESAMPLER struct resampler_itfe *resampler; char *buffer; +#endif size_t buffer_frames; int standby; struct echo_reference_itfe *echo_reference; @@ -1437,12 +1439,16 @@ static int start_output_stream_low_latency(struct tuna_stream_out *out) if (success) { out->buffer_frames = pcm_config_tones.period_size * 2; +#ifdef OUT_RESAMPLER if (out->buffer == NULL) out->buffer = malloc(out->buffer_frames * audio_stream_out_frame_size(&out->stream)); +#endif if (adev->echo_reference != NULL) out->echo_reference = adev->echo_reference; +#ifdef OUT_RESAMPLER out->resampler->reset(out->resampler); +#endif return 0; } @@ -1473,8 +1479,10 @@ static int start_output_stream_deep_buffer(struct tuna_stream_out *out) return -ENOMEM; } out->buffer_frames = DEEP_BUFFER_SHORT_PERIOD_SIZE * 2; +#ifdef OUT_RESAMPLER if (out->buffer == NULL) out->buffer = malloc(out->buffer_frames * audio_stream_out_frame_size(&out->stream)); +#endif return 0; } @@ -1962,6 +1970,7 @@ static ssize_t out_write_low_latency(struct audio_stream_out *stream, const void } pthread_mutex_unlock(&adev->lock); +#ifdef OUT_RESAMPLER for (i = 0; i < PCM_TOTAL; i++) { /* only use resampler if required */ if (out->pcm[i] && (out->config[i].rate != DEFAULT_OUT_SAMPLING_RATE)) { @@ -1974,6 +1983,7 @@ static ssize_t out_write_low_latency(struct audio_stream_out *stream, const void break; } } +#endif if (out->echo_reference != NULL) { struct echo_reference_buffer b; @@ -1987,13 +1997,17 @@ static ssize_t out_write_low_latency(struct audio_stream_out *stream, const void /* Write to all active PCMs */ for (i = 0; i < PCM_TOTAL; i++) { if (out->pcm[i]) { +#ifdef OUT_RESAMPLER if (out->config[i].rate == DEFAULT_OUT_SAMPLING_RATE) { /* PCM uses native sample rate */ +#endif ret = PCM_WRITE(out->pcm[i], (void *)buffer, bytes); +#ifdef OUT_RESAMPLER } else { /* PCM needs resampler */ ret = PCM_WRITE(out->pcm[i], (void *)out->buffer, out_frames * frame_size); } +#endif if (ret) break; } @@ -2067,6 +2081,7 @@ static ssize_t out_write_deep_buffer(struct audio_stream_out *stream, const void out->use_long_periods = use_long_periods; } +#ifdef OUT_RESAMPLER /* only use resampler if required */ if (out->config[PCM_NORMAL].rate != DEFAULT_OUT_SAMPLING_RATE) { out_frames = out->buffer_frames; @@ -2077,9 +2092,12 @@ static ssize_t out_write_deep_buffer(struct audio_stream_out *stream, const void &out_frames); buf = (void *)out->buffer; } else { +#endif out_frames = in_frames; buf = (void *)buffer; +#ifdef OUT_RESAMPLER } +#endif /* do not allow more than out->write_threshold frames in kernel pcm driver buffer */ do { @@ -3296,6 +3314,7 @@ static int adev_open_output_stream(struct audio_hw_device *dev, out->stream.set_volume = out_set_volume; } +#ifdef OUT_RESAMPLER ret = create_resampler(DEFAULT_OUT_SAMPLING_RATE, MM_FULL_POWER_SAMPLING_RATE, 2, @@ -3304,6 +3323,7 @@ static int adev_open_output_stream(struct audio_hw_device *dev, &out->resampler); if (ret != 0) goto err_open; +#endif out->stream.common.set_sample_rate = out_set_sample_rate; out->stream.common.get_channels = out_get_channels; @@ -3357,10 +3377,12 @@ static void adev_close_output_stream(struct audio_hw_device *dev, } } +#ifdef OUT_RESAMPLER if (out->buffer) free(out->buffer); if (out->resampler) release_resampler(out->resampler); +#endif free(stream); } -- cgit v1.1