diff options
Diffstat (limited to 'services')
-rw-r--r-- | services/audioflinger/AudioMixer.cpp | 14 | ||||
-rw-r--r-- | services/audioflinger/AudioResampler.cpp | 55 | ||||
-rw-r--r-- | services/audioflinger/AudioResampler.h | 6 | ||||
-rw-r--r-- | services/audioflinger/AudioResamplerCubic.h | 4 | ||||
-rw-r--r-- | services/audioflinger/AudioResamplerDyn.cpp | 4 | ||||
-rw-r--r-- | services/audioflinger/AudioResamplerDyn.h | 2 | ||||
-rw-r--r-- | services/audioflinger/AudioResamplerSinc.cpp | 4 | ||||
-rw-r--r-- | services/audioflinger/AudioResamplerSinc.h | 2 | ||||
-rw-r--r-- | services/audioflinger/Tracks.cpp | 3 | ||||
-rw-r--r-- | services/audioflinger/test-resample.cpp | 10 | ||||
-rw-r--r-- | services/audioflinger/tests/resampler_tests.cpp | 9 | ||||
-rw-r--r-- | services/audiopolicy/AudioPolicyManager.cpp | 3 | ||||
-rw-r--r-- | services/camera/libcameraservice/api1/client2/StreamingProcessor.cpp | 22 | ||||
-rw-r--r-- | services/camera/libcameraservice/api1/client2/ZslProcessor3.cpp | 33 | ||||
-rw-r--r-- | services/camera/libcameraservice/common/CameraDeviceBase.h | 1 | ||||
-rw-r--r-- | services/camera/libcameraservice/device3/Camera3Device.cpp | 10 | ||||
-rw-r--r-- | services/soundtrigger/SoundTriggerHwService.cpp | 25 |
17 files changed, 123 insertions, 84 deletions
diff --git a/services/audioflinger/AudioMixer.cpp b/services/audioflinger/AudioMixer.cpp index af312c4..4dbbc43 100644 --- a/services/audioflinger/AudioMixer.cpp +++ b/services/audioflinger/AudioMixer.cpp @@ -763,21 +763,9 @@ bool AudioMixer::track_t::setResampler(uint32_t value, uint32_t devSampleRate) quality = AudioResampler::DEFAULT_QUALITY; } - int bits; - switch (mMixerInFormat) { - case AUDIO_FORMAT_PCM_16_BIT: - bits = 16; - break; - case AUDIO_FORMAT_PCM_FLOAT: - bits = 32; // 32 bits to the AudioResampler::create() indicates float. - break; - default: - LOG_ALWAYS_FATAL("Invalid mMixerInFormat: %#x", mMixerInFormat); - break; - } ALOGVV("Creating resampler with %d bits\n", bits); resampler = AudioResampler::create( - bits, + mMixerInFormat, // the resampler sees the number of channels after the downmixer, if any (int) (downmixerBufferProvider != NULL ? MAX_NUM_CHANNELS : channelCount), devSampleRate, quality); diff --git a/services/audioflinger/AudioResampler.cpp b/services/audioflinger/AudioResampler.cpp index b8a0357..38c9061 100644 --- a/services/audioflinger/AudioResampler.cpp +++ b/services/audioflinger/AudioResampler.cpp @@ -40,8 +40,8 @@ namespace android { class AudioResamplerOrder1 : public AudioResampler { public: - AudioResamplerOrder1(int bitDepth, int inChannelCount, int32_t sampleRate) : - AudioResampler(bitDepth, inChannelCount, sampleRate, LOW_QUALITY), mX0L(0), mX0R(0) { + AudioResamplerOrder1(int inChannelCount, int32_t sampleRate) : + AudioResampler(inChannelCount, sampleRate, LOW_QUALITY), mX0L(0), mX0R(0) { } virtual void resample(int32_t* out, size_t outFrameCount, AudioBufferProvider* provider); @@ -145,7 +145,7 @@ static const uint32_t maxMHz = 130; // an arbitrary number that permits 3 VHQ, s static pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER; static uint32_t currentMHz = 0; -AudioResampler* AudioResampler::create(int bitDepth, int inChannelCount, +AudioResampler* AudioResampler::create(audio_format_t format, int inChannelCount, int32_t sampleRate, src_quality quality) { bool atFinalQuality; @@ -216,33 +216,40 @@ AudioResampler* AudioResampler::create(int bitDepth, int inChannelCount, default: case LOW_QUALITY: ALOGV("Create linear Resampler"); - resampler = new AudioResamplerOrder1(bitDepth, inChannelCount, sampleRate); + LOG_ALWAYS_FATAL_IF(format != AUDIO_FORMAT_PCM_16_BIT); + resampler = new AudioResamplerOrder1(inChannelCount, sampleRate); break; case MED_QUALITY: ALOGV("Create cubic Resampler"); - resampler = new AudioResamplerCubic(bitDepth, inChannelCount, sampleRate); + LOG_ALWAYS_FATAL_IF(format != AUDIO_FORMAT_PCM_16_BIT); + resampler = new AudioResamplerCubic(inChannelCount, sampleRate); break; case HIGH_QUALITY: ALOGV("Create HIGH_QUALITY sinc Resampler"); - resampler = new AudioResamplerSinc(bitDepth, inChannelCount, sampleRate); + LOG_ALWAYS_FATAL_IF(format != AUDIO_FORMAT_PCM_16_BIT); + resampler = new AudioResamplerSinc(inChannelCount, sampleRate); break; case VERY_HIGH_QUALITY: ALOGV("Create VERY_HIGH_QUALITY sinc Resampler = %d", quality); - resampler = new AudioResamplerSinc(bitDepth, inChannelCount, sampleRate, quality); + LOG_ALWAYS_FATAL_IF(format != AUDIO_FORMAT_PCM_16_BIT); + resampler = new AudioResamplerSinc(inChannelCount, sampleRate, quality); break; case DYN_LOW_QUALITY: case DYN_MED_QUALITY: case DYN_HIGH_QUALITY: ALOGV("Create dynamic Resampler = %d", quality); - if (bitDepth == 32) { /* bitDepth == 32 signals float precision */ - resampler = new AudioResamplerDyn<float, float, float>(bitDepth, inChannelCount, - sampleRate, quality); - } else if (quality == DYN_HIGH_QUALITY) { - resampler = new AudioResamplerDyn<int32_t, int16_t, int32_t>(bitDepth, inChannelCount, + if (format == AUDIO_FORMAT_PCM_FLOAT) { + resampler = new AudioResamplerDyn<float, float, float>(inChannelCount, sampleRate, quality); } else { - resampler = new AudioResamplerDyn<int16_t, int16_t, int32_t>(bitDepth, inChannelCount, - sampleRate, quality); + LOG_ALWAYS_FATAL_IF(format != AUDIO_FORMAT_PCM_16_BIT); + if (quality == DYN_HIGH_QUALITY) { + resampler = new AudioResamplerDyn<int32_t, int16_t, int32_t>(inChannelCount, + sampleRate, quality); + } else { + resampler = new AudioResamplerDyn<int16_t, int16_t, int32_t>(inChannelCount, + sampleRate, quality); + } } break; } @@ -252,18 +259,17 @@ AudioResampler* AudioResampler::create(int bitDepth, int inChannelCount, return resampler; } -AudioResampler::AudioResampler(int bitDepth, int inChannelCount, +AudioResampler::AudioResampler(int inChannelCount, int32_t sampleRate, src_quality quality) : - mBitDepth(bitDepth), mChannelCount(inChannelCount), - mSampleRate(sampleRate), mInSampleRate(sampleRate), mInputIndex(0), - mPhaseFraction(0), mLocalTimeFreq(0), - mPTS(AudioBufferProvider::kInvalidPTS), mQuality(quality) { - // sanity check on format - if ((bitDepth != 16 && (quality < DYN_LOW_QUALITY || bitDepth != 32)) - || inChannelCount < 1 + mChannelCount(inChannelCount), + mSampleRate(sampleRate), mInSampleRate(sampleRate), mInputIndex(0), + mPhaseFraction(0), mLocalTimeFreq(0), + mPTS(AudioBufferProvider::kInvalidPTS), mQuality(quality) { + + if (inChannelCount < 1 || inChannelCount > (quality < DYN_LOW_QUALITY ? 2 : 8)) { - LOG_ALWAYS_FATAL("Unsupported sample format %d quality %d bits, %d channels", - quality, bitDepth, inChannelCount); + LOG_ALWAYS_FATAL("Unsupported sample format %d quality %d channels", + quality, inChannelCount); } if (sampleRate <= 0) { LOG_ALWAYS_FATAL("Unsupported sample rate %d Hz", sampleRate); @@ -272,7 +278,6 @@ AudioResampler::AudioResampler(int bitDepth, int inChannelCount, // initialize common members mVolume[0] = mVolume[1] = 0; mBuffer.frameCount = 0; - } AudioResampler::~AudioResampler() { diff --git a/services/audioflinger/AudioResampler.h b/services/audioflinger/AudioResampler.h index b84567e..be747f6 100644 --- a/services/audioflinger/AudioResampler.h +++ b/services/audioflinger/AudioResampler.h @@ -22,6 +22,7 @@ #include <cutils/compiler.h> #include <media/AudioBufferProvider.h> +#include <system/audio.h> namespace android { // ---------------------------------------------------------------------------- @@ -46,7 +47,7 @@ public: DYN_HIGH_QUALITY=7, }; - static AudioResampler* create(int bitDepth, int inChannelCount, + static AudioResampler* create(audio_format_t format, int inChannelCount, int32_t sampleRate, src_quality quality=DEFAULT_QUALITY); virtual ~AudioResampler(); @@ -86,7 +87,7 @@ protected: // multiplier to calculate fixed point phase increment static const double kPhaseMultiplier; - AudioResampler(int bitDepth, int inChannelCount, int32_t sampleRate, src_quality quality); + AudioResampler(int inChannelCount, int32_t sampleRate, src_quality quality); // prevent copying AudioResampler(const AudioResampler&); @@ -94,7 +95,6 @@ protected: int64_t calculateOutputPTS(int outputFrameIndex); - const int32_t mBitDepth; const int32_t mChannelCount; const int32_t mSampleRate; int32_t mInSampleRate; diff --git a/services/audioflinger/AudioResamplerCubic.h b/services/audioflinger/AudioResamplerCubic.h index 203b933..b315da5 100644 --- a/services/audioflinger/AudioResamplerCubic.h +++ b/services/audioflinger/AudioResamplerCubic.h @@ -28,8 +28,8 @@ namespace android { class AudioResamplerCubic : public AudioResampler { public: - AudioResamplerCubic(int bitDepth, int inChannelCount, int32_t sampleRate) : - AudioResampler(bitDepth, inChannelCount, sampleRate, MED_QUALITY) { + AudioResamplerCubic(int inChannelCount, int32_t sampleRate) : + AudioResampler(inChannelCount, sampleRate, MED_QUALITY) { } virtual void resample(int32_t* out, size_t outFrameCount, AudioBufferProvider* provider); diff --git a/services/audioflinger/AudioResamplerDyn.cpp b/services/audioflinger/AudioResamplerDyn.cpp index 7ca10c1..043c803 100644 --- a/services/audioflinger/AudioResamplerDyn.cpp +++ b/services/audioflinger/AudioResamplerDyn.cpp @@ -162,9 +162,9 @@ void AudioResamplerDyn<TC, TI, TO>::Constants::set( } template<typename TC, typename TI, typename TO> -AudioResamplerDyn<TC, TI, TO>::AudioResamplerDyn(int bitDepth, +AudioResamplerDyn<TC, TI, TO>::AudioResamplerDyn( int inChannelCount, int32_t sampleRate, src_quality quality) - : AudioResampler(bitDepth, inChannelCount, sampleRate, quality), + : AudioResampler(inChannelCount, sampleRate, quality), mResampleFunc(0), mFilterSampleRate(0), mFilterQuality(DEFAULT_QUALITY), mCoefBuffer(NULL) { diff --git a/services/audioflinger/AudioResamplerDyn.h b/services/audioflinger/AudioResamplerDyn.h index 3dced8a..3044bfb 100644 --- a/services/audioflinger/AudioResamplerDyn.h +++ b/services/audioflinger/AudioResamplerDyn.h @@ -41,7 +41,7 @@ namespace android { template<typename TC, typename TI, typename TO> class AudioResamplerDyn: public AudioResampler { public: - AudioResamplerDyn(int bitDepth, int inChannelCount, + AudioResamplerDyn(int inChannelCount, int32_t sampleRate, src_quality quality); virtual ~AudioResamplerDyn(); diff --git a/services/audioflinger/AudioResamplerSinc.cpp b/services/audioflinger/AudioResamplerSinc.cpp index 35553ef..60ff88e 100644 --- a/services/audioflinger/AudioResamplerSinc.cpp +++ b/services/audioflinger/AudioResamplerSinc.cpp @@ -452,9 +452,9 @@ int32_t mulAddRL(int left, uint32_t inRL, int32_t v, int32_t a) // ---------------------------------------------------------------------------- -AudioResamplerSinc::AudioResamplerSinc(int bitDepth, +AudioResamplerSinc::AudioResamplerSinc( int inChannelCount, int32_t sampleRate, src_quality quality) - : AudioResampler(bitDepth, inChannelCount, sampleRate, quality), + : AudioResampler(inChannelCount, sampleRate, quality), mState(0), mImpulse(0), mRingFull(0), mFirCoefs(0) { /* diff --git a/services/audioflinger/AudioResamplerSinc.h b/services/audioflinger/AudioResamplerSinc.h index 1ea4474..97ae3d0 100644 --- a/services/audioflinger/AudioResamplerSinc.h +++ b/services/audioflinger/AudioResamplerSinc.h @@ -34,7 +34,7 @@ typedef int32_t (*readResampleFirLerpIntBitsFn)(); class AudioResamplerSinc : public AudioResampler { public: - AudioResamplerSinc(int bitDepth, int inChannelCount, int32_t sampleRate, + AudioResamplerSinc(int inChannelCount, int32_t sampleRate, src_quality quality = HIGH_QUALITY); virtual ~AudioResamplerSinc(); diff --git a/services/audioflinger/Tracks.cpp b/services/audioflinger/Tracks.cpp index 4fbb973..0ef9fe5 100644 --- a/services/audioflinger/Tracks.cpp +++ b/services/audioflinger/Tracks.cpp @@ -1895,7 +1895,8 @@ AudioFlinger::RecordThread::RecordTrack::RecordTrack( if (thread->mSampleRate != sampleRate && thread->mChannelCount <= FCC_2 && channelCount <= FCC_2) { // sink SR - mResampler = AudioResampler::create(16, thread->mChannelCount, sampleRate); + mResampler = AudioResampler::create(AUDIO_FORMAT_PCM_16_BIT, + thread->mChannelCount, sampleRate); // source SR mResampler->setSampleRate(thread->mSampleRate); mResampler->setVolume(AudioMixer::UNITY_GAIN_INT, AudioMixer::UNITY_GAIN_INT); diff --git a/services/audioflinger/test-resample.cpp b/services/audioflinger/test-resample.cpp index e14b4ae..78c9927 100644 --- a/services/audioflinger/test-resample.cpp +++ b/services/audioflinger/test-resample.cpp @@ -14,8 +14,6 @@ * limitations under the License. */ -#include "AudioResampler.h" -#include <media/AudioBufferProvider.h> #include <unistd.h> #include <stdio.h> #include <stdlib.h> @@ -30,6 +28,8 @@ #include <audio_utils/primitives.h> #include <audio_utils/sndfile.h> #include <utils/Vector.h> +#include <media/AudioBufferProvider.h> +#include "AudioResampler.h" using namespace android; @@ -329,7 +329,7 @@ int main(int argc, char* argv[]) { printf("%zu input frames\n", input_frames); } - int bit_depth = useFloat ? 32 : 16; + audio_format_t format = useFloat ? AUDIO_FORMAT_PCM_FLOAT : AUDIO_FORMAT_PCM_16_BIT; int output_channels = channels > 2 ? channels : 2; // output is at least stereo samples size_t output_framesize = output_channels * (useFloat ? sizeof(float) : sizeof(int32_t)); size_t output_frames = ((int64_t) input_frames * output_freq) / input_freq; @@ -342,7 +342,7 @@ int main(int argc, char* argv[]) { // // On fast devices, filters should be generated between 0.1ms - 1ms. // (single threaded). - AudioResampler* resampler = AudioResampler::create(bit_depth, channels, + AudioResampler* resampler = AudioResampler::create(format, channels, 8000, quality); int looplimit = 100; timespec start, end; @@ -380,7 +380,7 @@ int main(int argc, char* argv[]) { } void* output_vaddr = malloc(output_size); - AudioResampler* resampler = AudioResampler::create(bit_depth, channels, + AudioResampler* resampler = AudioResampler::create(format, channels, output_freq, quality); diff --git a/services/audioflinger/tests/resampler_tests.cpp b/services/audioflinger/tests/resampler_tests.cpp index d76c376..987162c 100644 --- a/services/audioflinger/tests/resampler_tests.cpp +++ b/services/audioflinger/tests/resampler_tests.cpp @@ -69,7 +69,7 @@ void testBufferIncrement(size_t channels, bool useFloat, unsigned inputFreq, unsigned outputFreq, enum android::AudioResampler::src_quality quality) { - const int bits = useFloat ? 32 : 16; + const audio_format_t format = useFloat ? AUDIO_FORMAT_PCM_FLOAT : AUDIO_FORMAT_PCM_16_BIT; // create the provider std::vector<int> inputIncr; SignalProvider provider; @@ -92,7 +92,7 @@ void testBufferIncrement(size_t channels, bool useFloat, const int volumePrecision = 12; /* typical unity gain */ android::AudioResampler* resampler; - resampler = android::AudioResampler::create(bits, channels, outputFreq, quality); + resampler = android::AudioResampler::create(format, channels, outputFreq, quality); resampler->setSampleRate(inputFreq); resampler->setVolume(1 << volumePrecision, 1 << volumePrecision); @@ -109,7 +109,7 @@ void testBufferIncrement(size_t channels, bool useFloat, resampler->reset(); #else delete resampler; - resampler = android::AudioResampler::create(bits, channels, outputFreq, quality); + resampler = android::AudioResampler::create(format, channels, outputFreq, quality); resampler->setSampleRate(inputFreq); resampler->setVolume(1 << volumePrecision, 1 << volumePrecision); #endif @@ -174,7 +174,8 @@ void testStopbandDownconversion(size_t channels, const int volumePrecision = 12; /* typical unity gain */ android::AudioResampler* resampler; - resampler = android::AudioResampler::create(16, channels, outputFreq, quality); + resampler = android::AudioResampler::create(AUDIO_FORMAT_PCM_16_BIT, + channels, outputFreq, quality); resampler->setSampleRate(inputFreq); resampler->setVolume(1 << volumePrecision, 1 << volumePrecision); diff --git a/services/audiopolicy/AudioPolicyManager.cpp b/services/audiopolicy/AudioPolicyManager.cpp index 95179b7..bb3bce8 100644 --- a/services/audiopolicy/AudioPolicyManager.cpp +++ b/services/audiopolicy/AudioPolicyManager.cpp @@ -101,6 +101,7 @@ const StringToEnum sDeviceNameToEnumTable[] = { STRING_TO_ENUM(AUDIO_DEVICE_IN_LINE), STRING_TO_ENUM(AUDIO_DEVICE_IN_SPDIF), STRING_TO_ENUM(AUDIO_DEVICE_IN_BLUETOOTH_A2DP), + STRING_TO_ENUM(AUDIO_DEVICE_IN_LOOPBACK), }; const StringToEnum sFlagNameToEnumTable[] = { @@ -4104,7 +4105,7 @@ const AudioPolicyManager::VolumeCurvePoint const AudioPolicyManager::VolumeCurvePoint AudioPolicyManager::sSpeakerMediaVolumeCurveDrc[AudioPolicyManager::VOLCNT] = { - {1, -56.0f}, {20, -34.0f}, {86, -10.0f}, {100, 0.0f} + {1, -55.0f}, {20, -43.0f}, {86, -12.0f}, {100, 0.0f} }; const AudioPolicyManager::VolumeCurvePoint diff --git a/services/camera/libcameraservice/api1/client2/StreamingProcessor.cpp b/services/camera/libcameraservice/api1/client2/StreamingProcessor.cpp index 99abced..911f55a 100644 --- a/services/camera/libcameraservice/api1/client2/StreamingProcessor.cpp +++ b/services/camera/libcameraservice/api1/client2/StreamingProcessor.cpp @@ -89,8 +89,26 @@ status_t StreamingProcessor::updatePreviewRequest(const Parameters ¶ms) { Mutex::Autolock m(mMutex); if (mPreviewRequest.entryCount() == 0) { - res = device->createDefaultRequest(CAMERA2_TEMPLATE_PREVIEW, - &mPreviewRequest); + sp<Camera2Client> client = mClient.promote(); + if (client == 0) { + ALOGE("%s: Camera %d: Client does not exist", __FUNCTION__, mId); + return INVALID_OPERATION; + } + + // Use CAMERA3_TEMPLATE_ZERO_SHUTTER_LAG for ZSL streaming case. + if (client->getCameraDeviceVersion() >= CAMERA_DEVICE_API_VERSION_3_0) { + if (params.zslMode && !params.recordingHint) { + res = device->createDefaultRequest(CAMERA3_TEMPLATE_ZERO_SHUTTER_LAG, + &mPreviewRequest); + } else { + res = device->createDefaultRequest(CAMERA3_TEMPLATE_PREVIEW, + &mPreviewRequest); + } + } else { + res = device->createDefaultRequest(CAMERA2_TEMPLATE_PREVIEW, + &mPreviewRequest); + } + if (res != OK) { ALOGE("%s: Camera %d: Unable to create default preview request: " "%s (%d)", __FUNCTION__, mId, strerror(-res), res); diff --git a/services/camera/libcameraservice/api1/client2/ZslProcessor3.cpp b/services/camera/libcameraservice/api1/client2/ZslProcessor3.cpp index ae537e2..79f75a5 100644 --- a/services/camera/libcameraservice/api1/client2/ZslProcessor3.cpp +++ b/services/camera/libcameraservice/api1/client2/ZslProcessor3.cpp @@ -290,18 +290,45 @@ status_t ZslProcessor3::pushToReprocess(int32_t requestId) { uint8_t requestType = ANDROID_REQUEST_TYPE_REPROCESS; res = request.update(ANDROID_REQUEST_TYPE, &requestType, 1); + if (res != OK) { + ALOGE("%s: Unable to update request type", + __FUNCTION__); + return INVALID_OPERATION; + } + int32_t inputStreams[1] = { mZslStreamId }; - if (res == OK) request.update(ANDROID_REQUEST_INPUT_STREAMS, + res = request.update(ANDROID_REQUEST_INPUT_STREAMS, inputStreams, 1); + if (res != OK) { + ALOGE("%s: Unable to update request input streams", + __FUNCTION__); + return INVALID_OPERATION; + } + + uint8_t captureIntent = + static_cast<uint8_t>(ANDROID_CONTROL_CAPTURE_INTENT_STILL_CAPTURE); + res = request.update(ANDROID_CONTROL_CAPTURE_INTENT, + &captureIntent, 1); + if (res != OK ) { + ALOGE("%s: Unable to update request capture intent", + __FUNCTION__); + return INVALID_OPERATION; + } + // TODO: Shouldn't we also update the latest preview frame? int32_t outputStreams[1] = { client->getCaptureStreamId() }; - if (res == OK) request.update(ANDROID_REQUEST_OUTPUT_STREAMS, + res = request.update(ANDROID_REQUEST_OUTPUT_STREAMS, outputStreams, 1); + if (res != OK) { + ALOGE("%s: Unable to update request output streams", + __FUNCTION__); + return INVALID_OPERATION; + } + res = request.update(ANDROID_REQUEST_ID, &requestId, 1); - if (res != OK ) { ALOGE("%s: Unable to update frame to a reprocess request", __FUNCTION__); diff --git a/services/camera/libcameraservice/common/CameraDeviceBase.h b/services/camera/libcameraservice/common/CameraDeviceBase.h index 7597b10..c7bd886 100644 --- a/services/camera/libcameraservice/common/CameraDeviceBase.h +++ b/services/camera/libcameraservice/common/CameraDeviceBase.h @@ -26,6 +26,7 @@ #include <camera/camera2/ICameraDeviceCallbacks.h> #include "hardware/camera2.h" +#include "hardware/camera3.h" #include "camera/CameraMetadata.h" #include "camera/CaptureResult.h" diff --git a/services/camera/libcameraservice/device3/Camera3Device.cpp b/services/camera/libcameraservice/device3/Camera3Device.cpp index bbb1e1c..6ceb9d4 100644 --- a/services/camera/libcameraservice/device3/Camera3Device.cpp +++ b/services/camera/libcameraservice/device3/Camera3Device.cpp @@ -1929,11 +1929,11 @@ void Camera3Device::processCaptureResult(const camera3_capture_result *result) { ALOGE("%s: RequestThread: Can't return input buffer for frame %d to" " its stream:%s (%d)", __FUNCTION__, frameNumber, strerror(-res), res); - } else { - ALOGW("%s: Input buffer should be NULL if there is no input" - " buffer sent in the request", - __FUNCTION__); - } + } + } else { + ALOGW("%s: Input buffer should be NULL if there is no input" + " buffer sent in the request, skipping input buffer return.", + __FUNCTION__); } } diff --git a/services/soundtrigger/SoundTriggerHwService.cpp b/services/soundtrigger/SoundTriggerHwService.cpp index fa59388..747af79 100644 --- a/services/soundtrigger/SoundTriggerHwService.cpp +++ b/services/soundtrigger/SoundTriggerHwService.cpp @@ -377,7 +377,7 @@ status_t SoundTriggerHwService::Module::unloadSoundModel(sound_model_handle_t ha } status_t SoundTriggerHwService::Module::startRecognition(sound_model_handle_t handle, - const sp<IMemory>& dataMemory) + const sp<IMemory>& dataMemory) { ALOGV("startRecognition() model handle %d", handle); @@ -391,28 +391,25 @@ status_t SoundTriggerHwService::Module::startRecognition(sound_model_handle_t ha if (model == 0) { return BAD_VALUE; } + if ((dataMemory == 0) || + (dataMemory->size() < sizeof(struct sound_trigger_recognition_config))) { + return BAD_VALUE; + } if (model->mState == Model::STATE_ACTIVE) { return INVALID_OPERATION; } model->mState = Model::STATE_ACTIVE; - char *data = NULL; - unsigned int data_size = 0; - if (dataMemory != 0 && dataMemory->size() != 0) { - data_size = (unsigned int)dataMemory->size(); - data = (char *)dataMemory->pointer(); - ALOGV("startRecognition() data size %d data %d - %d", - data_size, data[0], data[data_size - 1]); - } + struct sound_trigger_recognition_config *config = + (struct sound_trigger_recognition_config *)dataMemory->pointer(); //TODO: get capture handle and device from audio policy service - audio_io_handle_t capture_handle = 0; - return mHwDevice->start_recognition(mHwDevice, handle, capture_handle, AUDIO_DEVICE_NONE, + config->capture_handle = AUDIO_IO_HANDLE_NONE; + config->capture_device = AUDIO_DEVICE_NONE; + return mHwDevice->start_recognition(mHwDevice, handle, config, SoundTriggerHwService::recognitionCallback, - this, - data_size, - data); + this); } status_t SoundTriggerHwService::Module::stopRecognition(sound_model_handle_t handle) |