Adding Audio HAL V5: Direction API
Bug: 119137468
Test: Testbed app.
Change-Id: I1b3c81079000958da80d36616fe06930d876aac3
diff --git a/media/libaudioclient/AudioRecord.cpp b/media/libaudioclient/AudioRecord.cpp
index 3223647..65b8a38 100644
--- a/media/libaudioclient/AudioRecord.cpp
+++ b/media/libaudioclient/AudioRecord.cpp
@@ -1398,6 +1398,17 @@
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<IBinder>& who __unused)
diff --git a/media/libaudioclient/aidl/android/media/IAudioRecord.aidl b/media/libaudioclient/aidl/android/media/IAudioRecord.aidl
index 01e0a71..cf9c7f4 100644
--- a/media/libaudioclient/aidl/android/media/IAudioRecord.aidl
+++ b/media/libaudioclient/aidl/android/media/IAudioRecord.aidl
@@ -36,4 +36,12 @@
/* 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 35a7e05..ebee124 100644
--- a/media/libaudioclient/include/media/AudioRecord.h
+++ b/media/libaudioclient/include/media/AudioRecord.h
@@ -534,6 +534,14 @@
*/
status_t getActiveMicrophones(std::vector<media::MicrophoneInfo>* 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 c12b362..2e35be6 100644
--- a/media/libaudiohal/impl/StreamHalHidl.cpp
+++ b/media/libaudiohal/impl/StreamHalHidl.cpp
@@ -854,5 +854,29 @@
}
#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<MicrophoneDirection>(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 f7b507e..9ac1067 100644
--- a/media/libaudiohal/impl/StreamHalHidl.h
+++ b/media/libaudiohal/impl/StreamHalHidl.h
@@ -220,6 +220,12 @@
// Get active microphones
virtual status_t getActiveMicrophones(std::vector<media::MicrophoneInfo> *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 26d30d4..fcb809b 100644
--- a/media/libaudiohal/impl/StreamHalLocal.cpp
+++ b/media/libaudiohal/impl/StreamHalLocal.cpp
@@ -368,5 +368,26 @@
}
#endif
+#if MAJOR_VERSION < 5
+status_t StreamInHalLocal::setMicrophoneDirection(audio_microphone_direction_t direction __unused) {
+ return INVALID_OPERATION;
+}
+
+status_t StreamInHalLocal::setMicrophoneFieldDimension(float zoom __unused) {
+ return INVALID_OPERATION;
+}
+#else
+status_t StreamInHalLocal::setMicrophoneDirection(audio_microphone_direction_t direction) {
+ if (mStream->set_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 4fd1960..3d6c50e 100644
--- a/media/libaudiohal/impl/StreamHalLocal.h
+++ b/media/libaudiohal/impl/StreamHalLocal.h
@@ -204,6 +204,12 @@
// Get active microphones
virtual status_t getActiveMicrophones(std::vector<media::MicrophoneInfo> *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 bd71dc0..ed8282f 100644
--- a/media/libaudiohal/include/media/audiohal/StreamHalInterface.h
+++ b/media/libaudiohal/include/media/audiohal/StreamHalInterface.h
@@ -179,6 +179,12 @@
// Get active microphones
virtual status_t getActiveMicrophones(std::vector<media::MicrophoneInfo> *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<record_track_metadata_t> tracks;
};
diff --git a/services/audioflinger/AudioFlinger.h b/services/audioflinger/AudioFlinger.h
index 6c698f6..4c0a5bc 100644
--- a/services/audioflinger/AudioFlinger.h
+++ b/services/audioflinger/AudioFlinger.h
@@ -579,6 +579,10 @@
virtual binder::Status stop();
virtual binder::Status getActiveMicrophones(
std::vector<media::MicrophoneInfo>* activeMicrophones);
+ virtual binder::Status setMicrophoneDirection(
+ int /*audio_microphone_direction_t*/ direction);
+ virtual binder::Status setMicrophoneFieldDimension(float zoom);
+
private:
const sp<RecordThread::RecordTrack> mRecordTrack;
diff --git a/services/audioflinger/RecordTracks.h b/services/audioflinger/RecordTracks.h
index 85f5456..32af7d5 100644
--- a/services/audioflinger/RecordTracks.h
+++ b/services/audioflinger/RecordTracks.h
@@ -71,6 +71,9 @@
status_t getActiveMicrophones(std::vector<media::MicrophoneInfo>* 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 c6941c0..a21bdfa 100644
--- a/services/audioflinger/Threads.cpp
+++ b/services/audioflinger/Threads.cpp
@@ -7578,6 +7578,20 @@
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 e8b2158..0f1b7b2 100644
--- a/services/audioflinger/Threads.h
+++ b/services/audioflinger/Threads.h
@@ -1541,6 +1541,9 @@
status_t getActiveMicrophones(std::vector<media::MicrophoneInfo>* 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 9a7f1f1..d23d19d 100644
--- a/services/audioflinger/Tracks.cpp
+++ b/services/audioflinger/Tracks.cpp
@@ -1710,6 +1710,18 @@
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<audio_microphone_direction_t>(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::setMicrophoneDirection(
+ audio_microphone_direction_t direction) {
+ sp<ThreadBase> 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<ThreadBase> 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"