diff --git a/media/libaudioclient/AudioRecord.cpp b/media/libaudioclient/AudioRecord.cpp index 3223647f54..65b8a389bc 100644 --- a/media/libaudioclient/AudioRecord.cpp +++ b/media/libaudioclient/AudioRecord.cpp @@ -1398,6 +1398,17 @@ status_t AudioRecord::getActiveMicrophones(std::vector* a return mAudioRecord->getActiveMicrophones(activeMicrophones).transactionError(); } +status_t AudioRecord::setMicrophoneDirection(audio_microphone_direction_t direction) +{ + AutoMutex lock(mLock); + return mAudioRecord->setMicrophoneDirection(direction).transactionError(); +} + +status_t AudioRecord::setMicrophoneFieldDimension(float zoom) { + AutoMutex lock(mLock); + return mAudioRecord->setMicrophoneFieldDimension(zoom).transactionError(); +} + // ========================================================================= void AudioRecord::DeathNotifier::binderDied(const wp& who __unused) diff --git a/media/libaudioclient/aidl/android/media/IAudioRecord.aidl b/media/libaudioclient/aidl/android/media/IAudioRecord.aidl index 01e0a7160f..cf9c7f44d2 100644 --- a/media/libaudioclient/aidl/android/media/IAudioRecord.aidl +++ b/media/libaudioclient/aidl/android/media/IAudioRecord.aidl @@ -36,4 +36,12 @@ interface IAudioRecord { /* Get a list of current active microphones. */ void getActiveMicrophones(out MicrophoneInfo[] activeMicrophones); + + /* Set the microphone direction (for processing). + */ + void setMicrophoneDirection(int /*audio_microphone_direction_t*/ direction); + + /* Set the microphone zoom (for processing). + */ + void setMicrophoneFieldDimension(float zoom); } diff --git a/media/libaudioclient/include/media/AudioRecord.h b/media/libaudioclient/include/media/AudioRecord.h index 35a7e0583f..ebee124e10 100644 --- a/media/libaudioclient/include/media/AudioRecord.h +++ b/media/libaudioclient/include/media/AudioRecord.h @@ -534,6 +534,14 @@ public: */ status_t getActiveMicrophones(std::vector* activeMicrophones); + /* Set the Microphone direction (for processing purposes). + */ + status_t setMicrophoneDirection(audio_microphone_direction_t direction); + + /* Set the Microphone zoom factor (for processing purposes). + */ + status_t setMicrophoneFieldDimension(float zoom); + /* Get the unique port ID assigned to this AudioRecord instance by audio policy manager. * The ID is unique across all audioserver clients and can change during the life cycle * of a given AudioRecord instance if the connection to audioserver is restored. diff --git a/media/libaudiohal/impl/StreamHalHidl.cpp b/media/libaudiohal/impl/StreamHalHidl.cpp index c12b3629c0..2e35be63fe 100644 --- a/media/libaudiohal/impl/StreamHalHidl.cpp +++ b/media/libaudiohal/impl/StreamHalHidl.cpp @@ -854,5 +854,29 @@ status_t StreamInHalHidl::updateSinkMetadata(const } #endif +#if MAJOR_VERSION < 5 +status_t StreamInHalHidl::setMicrophoneDirection(audio_microphone_direction_t direction __unused) { + if (mStream == 0) return NO_INIT; + return INVALID_OPERATION; +} + +status_t StreamInHalHidl::setMicrophoneFieldDimension(float zoom __unused) { + if (mStream == 0) return NO_INIT; + return INVALID_OPERATION; +} +#else +status_t StreamInHalHidl::setMicrophoneDirection(audio_microphone_direction_t direction) { + if (!mStream) return NO_INIT; + return processReturn("setMicrophoneDirection", + mStream->setMicrophoneDirection(static_cast(direction))); +} + +status_t StreamInHalHidl::setMicrophoneFieldDimension(float zoom) { + if (!mStream) return NO_INIT; + return processReturn("setMicrophoneFieldDimension", + mStream->setMicrophoneFieldDimension(zoom)); +} +#endif + } // namespace CPP_VERSION } // namespace android diff --git a/media/libaudiohal/impl/StreamHalHidl.h b/media/libaudiohal/impl/StreamHalHidl.h index f7b507e73c..9ac10674d1 100644 --- a/media/libaudiohal/impl/StreamHalHidl.h +++ b/media/libaudiohal/impl/StreamHalHidl.h @@ -220,6 +220,12 @@ class StreamInHalHidl : public StreamInHalInterface, public StreamHalHidl { // Get active microphones virtual status_t getActiveMicrophones(std::vector *microphones); + // Set microphone direction (for processing) + virtual status_t setMicrophoneDirection(audio_microphone_direction_t direction) override; + + // Set microphone zoom (for processing) + virtual status_t setMicrophoneFieldDimension(float zoom) override; + // Called when the metadata of the stream's sink has been changed. status_t updateSinkMetadata(const SinkMetadata& sinkMetadata) override; diff --git a/media/libaudiohal/impl/StreamHalLocal.cpp b/media/libaudiohal/impl/StreamHalLocal.cpp index 26d30d4746..fcb809bf53 100644 --- a/media/libaudiohal/impl/StreamHalLocal.cpp +++ b/media/libaudiohal/impl/StreamHalLocal.cpp @@ -368,5 +368,26 @@ status_t StreamInHalLocal::getActiveMicrophones(std::vectorset_microphone_direction == NULL) return INVALID_OPERATION; + return mStream->set_microphone_direction(mStream, direction); +} + +status_t StreamInHalLocal::setMicrophoneFieldDimension(float zoom) { + if (mStream->set_microphone_field_dimension == NULL) return INVALID_OPERATION; + return mStream->set_microphone_field_dimension(mStream, zoom); + +} +#endif + } // namespace CPP_VERSION } // namespace android diff --git a/media/libaudiohal/impl/StreamHalLocal.h b/media/libaudiohal/impl/StreamHalLocal.h index 4fd1960887..3d6c50ef97 100644 --- a/media/libaudiohal/impl/StreamHalLocal.h +++ b/media/libaudiohal/impl/StreamHalLocal.h @@ -204,6 +204,12 @@ class StreamInHalLocal : public StreamInHalInterface, public StreamHalLocal { // Get active microphones virtual status_t getActiveMicrophones(std::vector *microphones); + // Sets microphone direction (for processing) + virtual status_t setMicrophoneDirection(audio_microphone_direction_t direction); + + // Sets microphone zoom (for processing) + virtual status_t setMicrophoneFieldDimension(float zoom); + // Called when the metadata of the stream's sink has been changed. status_t updateSinkMetadata(const SinkMetadata& sinkMetadata) override; diff --git a/media/libaudiohal/include/media/audiohal/StreamHalInterface.h b/media/libaudiohal/include/media/audiohal/StreamHalInterface.h index bd71dc0986..ed8282fdfc 100644 --- a/media/libaudiohal/include/media/audiohal/StreamHalInterface.h +++ b/media/libaudiohal/include/media/audiohal/StreamHalInterface.h @@ -179,6 +179,12 @@ class StreamInHalInterface : public virtual StreamHalInterface { // Get active microphones virtual status_t getActiveMicrophones(std::vector *microphones) = 0; + // Set direction for capture processing + virtual status_t setMicrophoneDirection(audio_microphone_direction_t) = 0; + + // Set zoom factor for capture stream + virtual status_t setMicrophoneFieldDimension(float zoom) = 0; + struct SinkMetadata { std::vector tracks; }; diff --git a/services/audioflinger/AudioFlinger.h b/services/audioflinger/AudioFlinger.h index 6c698f63fc..4c0a5bcc8d 100644 --- a/services/audioflinger/AudioFlinger.h +++ b/services/audioflinger/AudioFlinger.h @@ -579,6 +579,10 @@ using effect_buffer_t = int16_t; virtual binder::Status stop(); virtual binder::Status getActiveMicrophones( std::vector* activeMicrophones); + virtual binder::Status setMicrophoneDirection( + int /*audio_microphone_direction_t*/ direction); + virtual binder::Status setMicrophoneFieldDimension(float zoom); + private: const sp mRecordTrack; diff --git a/services/audioflinger/RecordTracks.h b/services/audioflinger/RecordTracks.h index 85f5456b9e..32af7d5339 100644 --- a/services/audioflinger/RecordTracks.h +++ b/services/audioflinger/RecordTracks.h @@ -71,6 +71,9 @@ public: status_t getActiveMicrophones(std::vector* activeMicrophones); + status_t setMicrophoneDirection(audio_microphone_direction_t direction); + status_t setMicrophoneFieldDimension(float zoom); + static bool checkServerLatencySupported( audio_format_t format, audio_input_flags_t flags) { return audio_is_linear_pcm(format) diff --git a/services/audioflinger/Threads.cpp b/services/audioflinger/Threads.cpp index c6941c045d..a21bdfa482 100644 --- a/services/audioflinger/Threads.cpp +++ b/services/audioflinger/Threads.cpp @@ -7578,6 +7578,20 @@ status_t AudioFlinger::RecordThread::getActiveMicrophones( return status; } +status_t AudioFlinger::RecordThread::setMicrophoneDirection(audio_microphone_direction_t direction) +{ + ALOGV("RecordThread::setMicrophoneDirection"); + AutoMutex _l(mLock); + return mInput->stream->setMicrophoneDirection(direction); +} + +status_t AudioFlinger::RecordThread::setMicrophoneFieldDimension(float zoom) +{ + ALOGV("RecordThread::setMicrophoneFieldDimension"); + AutoMutex _l(mLock); + return mInput->stream->setMicrophoneFieldDimension(zoom); +} + void AudioFlinger::RecordThread::updateMetadata_l() { if (mInput == nullptr || mInput->stream == nullptr || diff --git a/services/audioflinger/Threads.h b/services/audioflinger/Threads.h index e8b2158e71..0f1b7b28f7 100644 --- a/services/audioflinger/Threads.h +++ b/services/audioflinger/Threads.h @@ -1541,6 +1541,9 @@ public: status_t getActiveMicrophones(std::vector* activeMicrophones); + status_t setMicrophoneDirection(audio_microphone_direction_t direction); + status_t setMicrophoneFieldDimension(float zoom); + void updateMetadata_l() override; bool fastTrackAvailable() const { return mFastTrackAvail; } diff --git a/services/audioflinger/Tracks.cpp b/services/audioflinger/Tracks.cpp index 9a7f1f1c94..d23d19d813 100644 --- a/services/audioflinger/Tracks.cpp +++ b/services/audioflinger/Tracks.cpp @@ -1710,6 +1710,18 @@ binder::Status AudioFlinger::RecordHandle::getActiveMicrophones( mRecordTrack->getActiveMicrophones(activeMicrophones)); } +binder::Status AudioFlinger::RecordHandle::setMicrophoneDirection( + int /*audio_microphone_direction_t*/ direction) { + ALOGV("%s()", __func__); + return binder::Status::fromStatusT(mRecordTrack->setMicrophoneDirection( + static_cast(direction))); +} + +binder::Status AudioFlinger::RecordHandle::setMicrophoneFieldDimension(float zoom) { + ALOGV("%s()", __func__); + return binder::Status::fromStatusT(mRecordTrack->setMicrophoneFieldDimension(zoom)); +} + // ---------------------------------------------------------------------------- #undef LOG_TAG #define LOG_TAG "AF::RecordTrack" @@ -2004,6 +2016,27 @@ status_t AudioFlinger::RecordThread::RecordTrack::getActiveMicrophones( } } +status_t AudioFlinger::RecordThread::RecordTrack::setMicrophoneDirection( + audio_microphone_direction_t direction) { + sp thread = mThread.promote(); + if (thread != 0) { + RecordThread *recordThread = (RecordThread *)thread.get(); + return recordThread->setMicrophoneDirection(direction); + } else { + return BAD_VALUE; + } +} + +status_t AudioFlinger::RecordThread::RecordTrack::setMicrophoneFieldDimension(float zoom) { + sp thread = mThread.promote(); + if (thread != 0) { + RecordThread *recordThread = (RecordThread *)thread.get(); + return recordThread->setMicrophoneFieldDimension(zoom); + } else { + return BAD_VALUE; + } +} + // ---------------------------------------------------------------------------- #undef LOG_TAG #define LOG_TAG "AF::PatchRecord"