Adding Audio HAL V5: Direction API

Bug: 119137468
Test: Testbed app.

Change-Id: I1b3c81079000958da80d36616fe06930d876aac3
gugelfrei
Paul McLean 6 years ago
parent c2684ac61b
commit 03a6e6a08d

@ -1398,6 +1398,17 @@ status_t AudioRecord::getActiveMicrophones(std::vector<media::MicrophoneInfo>* 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<IBinder>& who __unused)

@ -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);
}

@ -534,6 +534,14 @@ public:
*/
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.

@ -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<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

@ -220,6 +220,12 @@ class StreamInHalHidl : public StreamInHalInterface, public StreamHalHidl {
// 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;

@ -368,5 +368,26 @@ status_t StreamInHalLocal::getActiveMicrophones(std::vector<media::MicrophoneInf
}
#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

@ -204,6 +204,12 @@ class StreamInHalLocal : public StreamInHalInterface, public StreamHalLocal {
// 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;

@ -179,6 +179,12 @@ class StreamInHalInterface : public virtual StreamHalInterface {
// 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;
};

@ -579,6 +579,10 @@ using effect_buffer_t = int16_t;
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;

@ -71,6 +71,9 @@ public:
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)

@ -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 ||

@ -1541,6 +1541,9 @@ public:
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; }

@ -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<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::getActiveMicrophones(
}
}
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"

Loading…
Cancel
Save