diff --git a/media/libaaudio/libaaudio.map.txt b/media/libaaudio/libaaudio.map.txt index 2ba525012a245c84f13524f3b9676a7af79461ea..fca7b5042d60b2872c22a8de0854f79455a2cf83 100644 --- a/media/libaaudio/libaaudio.map.txt +++ b/media/libaaudio/libaaudio.map.txt @@ -17,6 +17,9 @@ LIBAAUDIO { AAudioStreamBuilder_setSharingMode; AAudioStreamBuilder_setDirection; AAudioStreamBuilder_setBufferCapacityInFrames; + AAudioStreamBuilder_setUsage; + AAudioStreamBuilder_setContentType; + AAudioStreamBuilder_setInputPreset; AAudioStreamBuilder_openStream; AAudioStreamBuilder_delete; AAudioStream_close; @@ -42,6 +45,9 @@ LIBAAUDIO { AAudioStream_getFormat; AAudioStream_getSharingMode; AAudioStream_getDirection; + AAudioStream_getUsage; + AAudioStream_getContentType; + AAudioStream_getInputPreset; AAudioStream_getFramesWritten; AAudioStream_getFramesRead; AAudioStream_getTimestamp; diff --git a/media/libaaudio/src/binding/AAudioStreamConfiguration.cpp b/media/libaaudio/src/binding/AAudioStreamConfiguration.cpp index 153fce3cb5f43d2dc124142cb35dd85e2dfe5c15..97672a0a74948599904330cbe05e9a92d5c5ad94 100644 --- a/media/libaaudio/src/binding/AAudioStreamConfiguration.cpp +++ b/media/libaaudio/src/binding/AAudioStreamConfiguration.cpp @@ -50,6 +50,12 @@ status_t AAudioStreamConfiguration::writeToParcel(Parcel* parcel) const { if (status != NO_ERROR) goto error; status = parcel->writeInt32(getBufferCapacity()); if (status != NO_ERROR) goto error; + status = parcel->writeInt32((int32_t) getUsage()); + if (status != NO_ERROR) goto error; + status = parcel->writeInt32((int32_t) getContentType()); + if (status != NO_ERROR) goto error; + status = parcel->writeInt32((int32_t) getInputPreset()); + if (status != NO_ERROR) goto error; return NO_ERROR; error: ALOGE("AAudioStreamConfiguration.writeToParcel(): write failed = %d", status); @@ -69,16 +75,25 @@ status_t AAudioStreamConfiguration::readFromParcel(const Parcel* parcel) { setSamplesPerFrame(value); status = parcel->readInt32(&value); if (status != NO_ERROR) goto error; - setSharingMode(value); + setSharingMode((aaudio_sharing_mode_t) value); status = parcel->readInt32(&value); if (status != NO_ERROR) goto error; - setFormat(value); + setFormat((aaudio_format_t) value); status = parcel->readInt32(&value); if (status != NO_ERROR) goto error; setDirection((aaudio_direction_t) value); status = parcel->readInt32(&value); if (status != NO_ERROR) goto error; setBufferCapacity(value); + status = parcel->readInt32(&value); + if (status != NO_ERROR) goto error; + setUsage((aaudio_usage_t) value); + status = parcel->readInt32(&value); + if (status != NO_ERROR) goto error; + setContentType((aaudio_content_type_t) value); + status = parcel->readInt32(&value); + if (status != NO_ERROR) goto error; + setInputPreset((aaudio_input_preset_t) value); return NO_ERROR; error: ALOGE("AAudioStreamConfiguration.readFromParcel(): read failed = %d", status); diff --git a/media/libaaudio/src/core/AAudioAudio.cpp b/media/libaaudio/src/core/AAudioAudio.cpp index bb007ac3aaab85e80666033941415e5b6da52bb3..9e5ca8ee01fe0ed7aa3418c09c3bcb47ae132b2f 100644 --- a/media/libaaudio/src/core/AAudioAudio.cpp +++ b/media/libaaudio/src/core/AAudioAudio.cpp @@ -177,6 +177,24 @@ AAUDIO_API void AAudioStreamBuilder_setSharingMode(AAudioStreamBuilder* builder, streamBuilder->setSharingMode(sharingMode); } +AAUDIO_API void AAudioStreamBuilder_setUsage(AAudioStreamBuilder* builder, + aaudio_usage_t usage) { + AudioStreamBuilder *streamBuilder = convertAAudioBuilderToStreamBuilder(builder); + streamBuilder->setUsage(usage); +} + +AAUDIO_API void AAudioStreamBuilder_setContentType(AAudioStreamBuilder* builder, + aaudio_content_type_t contentType) { + AudioStreamBuilder *streamBuilder = convertAAudioBuilderToStreamBuilder(builder); + streamBuilder->setContentType(contentType); +} + +AAUDIO_API void AAudioStreamBuilder_setInputPreset(AAudioStreamBuilder* builder, + aaudio_input_preset_t inputPreset) { + AudioStreamBuilder *streamBuilder = convertAAudioBuilderToStreamBuilder(builder); + streamBuilder->setInputPreset(inputPreset); +} + AAUDIO_API void AAudioStreamBuilder_setBufferCapacityInFrames(AAudioStreamBuilder* builder, int32_t frames) { @@ -447,6 +465,24 @@ AAUDIO_API aaudio_sharing_mode_t AAudioStream_getSharingMode(AAudioStream* strea return audioStream->getSharingMode(); } +AAUDIO_API aaudio_usage_t AAudioStream_getUsage(AAudioStream* stream) +{ + AudioStream *audioStream = convertAAudioStreamToAudioStream(stream); + return audioStream->getUsage(); +} + +AAUDIO_API aaudio_content_type_t AAudioStream_getContentType(AAudioStream* stream) +{ + AudioStream *audioStream = convertAAudioStreamToAudioStream(stream); + return audioStream->getContentType(); +} + +AAUDIO_API aaudio_input_preset_t AAudioStream_getInputPreset(AAudioStream* stream) +{ + AudioStream *audioStream = convertAAudioStreamToAudioStream(stream); + return audioStream->getInputPreset(); +} + AAUDIO_API int64_t AAudioStream_getFramesWritten(AAudioStream* stream) { AudioStream *audioStream = convertAAudioStreamToAudioStream(stream); diff --git a/media/libaaudio/src/core/AAudioStreamParameters.cpp b/media/libaaudio/src/core/AAudioStreamParameters.cpp index 6400eb447d71f0a16431a4f3cb719f6db404a278..23c4eb89656c0ec052b490fb0c7accd1ef914ebd 100644 --- a/media/libaaudio/src/core/AAudioStreamParameters.cpp +++ b/media/libaaudio/src/core/AAudioStreamParameters.cpp @@ -42,6 +42,9 @@ void AAudioStreamParameters::copyFrom(const AAudioStreamParameters &other) { mAudioFormat = other.mAudioFormat; mDirection = other.mDirection; mBufferCapacity = other.mBufferCapacity; + mUsage = other.mUsage; + mContentType = other.mContentType; + mInputPreset = other.mInputPreset; } aaudio_result_t AAudioStreamParameters::validate() const { @@ -98,6 +101,54 @@ aaudio_result_t AAudioStreamParameters::validate() const { // break; } + switch (mUsage) { + case AAUDIO_UNSPECIFIED: + case AAUDIO_USAGE_MEDIA: + case AAUDIO_USAGE_VOICE_COMMUNICATION: + case AAUDIO_USAGE_VOICE_COMMUNICATION_SIGNALLING: + case AAUDIO_USAGE_ALARM: + case AAUDIO_USAGE_NOTIFICATION: + case AAUDIO_USAGE_NOTIFICATION_RINGTONE: + case AAUDIO_USAGE_NOTIFICATION_EVENT: + case AAUDIO_USAGE_ASSISTANCE_ACCESSIBILITY: + case AAUDIO_USAGE_ASSISTANCE_NAVIGATION_GUIDANCE: + case AAUDIO_USAGE_ASSISTANCE_SONIFICATION: + case AAUDIO_USAGE_GAME: + case AAUDIO_USAGE_ASSISTANT: + break; // valid + default: + ALOGE("usage not valid = %d", mUsage); + return AAUDIO_ERROR_ILLEGAL_ARGUMENT; + // break; + } + + switch (mContentType) { + case AAUDIO_UNSPECIFIED: + case AAUDIO_CONTENT_TYPE_MUSIC: + case AAUDIO_CONTENT_TYPE_MOVIE: + case AAUDIO_CONTENT_TYPE_SONIFICATION: + case AAUDIO_CONTENT_TYPE_SPEECH: + break; // valid + default: + ALOGE("content type not valid = %d", mContentType); + return AAUDIO_ERROR_ILLEGAL_ARGUMENT; + // break; + } + + switch (mInputPreset) { + case AAUDIO_UNSPECIFIED: + case AAUDIO_INPUT_PRESET_GENERIC: + case AAUDIO_INPUT_PRESET_CAMCORDER: + case AAUDIO_INPUT_PRESET_VOICE_COMMUNICATION: + case AAUDIO_INPUT_PRESET_VOICE_RECOGNITION: + case AAUDIO_INPUT_PRESET_UNPROCESSED: + break; // valid + default: + ALOGE("input preset not valid = %d", mInputPreset); + return AAUDIO_ERROR_ILLEGAL_ARGUMENT; + // break; + } + return AAUDIO_OK; } @@ -109,5 +160,8 @@ void AAudioStreamParameters::dump() const { ALOGD("mAudioFormat = %6d", (int)mAudioFormat); ALOGD("mDirection = %6d", mDirection); ALOGD("mBufferCapacity = %6d", mBufferCapacity); + ALOGD("mUsage = %6d", mUsage); + ALOGD("mContentType = %6d", mContentType); + ALOGD("mInputPreset = %6d", mInputPreset); } diff --git a/media/libaaudio/src/core/AAudioStreamParameters.h b/media/libaaudio/src/core/AAudioStreamParameters.h index 5e67c934a08bd6c11595c9508654934c86ca5f14..0c173f5c3b437ca22008225f612603d76deea466 100644 --- a/media/libaaudio/src/core/AAudioStreamParameters.h +++ b/media/libaaudio/src/core/AAudioStreamParameters.h @@ -88,6 +88,30 @@ public: mDirection = direction; } + aaudio_usage_t getUsage() const { + return mUsage; + } + + void setUsage(aaudio_usage_t usage) { + mUsage = usage; + } + + aaudio_content_type_t getContentType() const { + return mContentType; + } + + void setContentType(aaudio_content_type_t contentType) { + mContentType = contentType; + } + + aaudio_input_preset_t getInputPreset() const { + return mInputPreset; + } + + void setInputPreset(aaudio_input_preset_t inputPreset) { + mInputPreset = inputPreset; + } + int32_t calculateBytesPerFrame() const { return getSamplesPerFrame() * AAudioConvert_formatToSizeInBytes(getFormat()); } @@ -109,6 +133,9 @@ private: aaudio_sharing_mode_t mSharingMode = AAUDIO_SHARING_MODE_SHARED; aaudio_format_t mAudioFormat = AAUDIO_FORMAT_UNSPECIFIED; aaudio_direction_t mDirection = AAUDIO_DIRECTION_OUTPUT; + aaudio_usage_t mUsage = AAUDIO_UNSPECIFIED; + aaudio_content_type_t mContentType = AAUDIO_UNSPECIFIED; + aaudio_input_preset_t mInputPreset = AAUDIO_UNSPECIFIED; int32_t mBufferCapacity = AAUDIO_UNSPECIFIED; }; diff --git a/media/libaaudio/src/core/AudioStream.cpp b/media/libaaudio/src/core/AudioStream.cpp index 8f5f5d312e76854133e26b8c5a2aa94f44b0c1e1..289e0dbdc1571bee14f33f11c0ada68130248b36 100644 --- a/media/libaaudio/src/core/AudioStream.cpp +++ b/media/libaaudio/src/core/AudioStream.cpp @@ -74,15 +74,28 @@ aaudio_result_t AudioStream::open(const AudioStreamBuilder& builder) } // Copy parameters from the Builder because the Builder may be deleted after this call. + // TODO AudioStream should be a subclass of AudioStreamParameters mSamplesPerFrame = builder.getSamplesPerFrame(); mSampleRate = builder.getSampleRate(); mDeviceId = builder.getDeviceId(); mFormat = builder.getFormat(); mSharingMode = builder.getSharingMode(); mSharingModeMatchRequired = builder.isSharingModeMatchRequired(); - mPerformanceMode = builder.getPerformanceMode(); + mUsage = builder.getUsage(); + if (mUsage == AAUDIO_UNSPECIFIED) { + mUsage = AAUDIO_USAGE_MEDIA; + } + mContentType = builder.getContentType(); + if (mContentType == AAUDIO_UNSPECIFIED) { + mContentType = AAUDIO_CONTENT_TYPE_MUSIC; + } + mInputPreset = builder.getInputPreset(); + if (mInputPreset == AAUDIO_UNSPECIFIED) { + mInputPreset = AAUDIO_INPUT_PRESET_GENERIC; + } + // callbacks mFramesPerDataCallback = builder.getFramesPerDataCallback(); mDataCallbackProc = builder.getDataCallbackProc(); diff --git a/media/libaaudio/src/core/AudioStream.h b/media/libaaudio/src/core/AudioStream.h index b5d7fd57c3ebc1d2bcfd7f0b2879ea234058719f..82e7189b4c6e1a0dcc2e048d144993452fd4e617 100644 --- a/media/libaaudio/src/core/AudioStream.h +++ b/media/libaaudio/src/core/AudioStream.h @@ -204,6 +204,18 @@ public: virtual aaudio_direction_t getDirection() const = 0; + aaudio_usage_t getUsage() const { + return mUsage; + } + + aaudio_content_type_t getContentType() const { + return mContentType; + } + + aaudio_input_preset_t getInputPreset() const { + return mInputPreset; + } + /** * This is only valid after setSamplesPerFrame() and setFormat() have been called. */ @@ -471,6 +483,9 @@ private: aaudio_format_t mFormat = AAUDIO_FORMAT_UNSPECIFIED; aaudio_stream_state_t mState = AAUDIO_STREAM_STATE_UNINITIALIZED; aaudio_performance_mode_t mPerformanceMode = AAUDIO_PERFORMANCE_MODE_NONE; + aaudio_usage_t mUsage = AAUDIO_USAGE_MEDIA; + aaudio_content_type_t mContentType = AAUDIO_CONTENT_TYPE_MUSIC; + aaudio_input_preset_t mInputPreset = AAUDIO_INPUT_PRESET_GENERIC; // callback ---------------------------------- diff --git a/media/libaaudio/src/legacy/AudioStreamRecord.cpp b/media/libaaudio/src/legacy/AudioStreamRecord.cpp index 55eed928cd25362cc724c6ec7bc35a60a97c661b..5f4ab9b3fe2345a891300c559ed89addc5c41da9 100644 --- a/media/libaaudio/src/legacy/AudioStreamRecord.cpp +++ b/media/libaaudio/src/legacy/AudioStreamRecord.cpp @@ -104,11 +104,24 @@ aaudio_result_t AudioStreamRecord::open(const AudioStreamBuilder& builder) ? AUDIO_PORT_HANDLE_NONE : getDeviceId(); + const audio_content_type_t contentType = + AAudioConvert_contentTypeToInternal(builder.getContentType()); + const audio_source_t source = + AAudioConvert_inputPresetToAudioSource(builder.getInputPreset()); + + const audio_attributes_t attributes = { + .content_type = contentType, + .usage = AUDIO_USAGE_UNKNOWN, // only used for output + .source = source, + .flags = flags, // If attributes are set then the other flags parameter is ignored. + .tags = "" + }; + mAudioRecord = new AudioRecord( mOpPackageName // const String16& opPackageName TODO does not compile ); mAudioRecord->set( - AUDIO_SOURCE_VOICE_RECOGNITION, + AUDIO_SOURCE_DEFAULT, // ignored because we pass attributes below getSampleRate(), format, channelMask, @@ -122,7 +135,7 @@ aaudio_result_t AudioStreamRecord::open(const AudioStreamBuilder& builder) flags, AUDIO_UID_INVALID, // DEFAULT uid -1, // DEFAULT pid - NULL, // DEFAULT audio_attributes_t + &attributes, selectedDeviceId ); diff --git a/media/libaaudio/src/legacy/AudioStreamTrack.cpp b/media/libaaudio/src/legacy/AudioStreamTrack.cpp index 51132781b58a59f895777cb2e277ccbc6c3d3ef8..17a8d5262081fbbf8976b35fda461a9adfbf0010 100644 --- a/media/libaaudio/src/legacy/AudioStreamTrack.cpp +++ b/media/libaaudio/src/legacy/AudioStreamTrack.cpp @@ -121,9 +121,22 @@ aaudio_result_t AudioStreamTrack::open(const AudioStreamBuilder& builder) ? AUDIO_PORT_HANDLE_NONE : getDeviceId(); + const audio_content_type_t contentType = + AAudioConvert_contentTypeToInternal(builder.getContentType()); + const audio_usage_t usage = + AAudioConvert_usageToInternal(builder.getUsage()); + + const audio_attributes_t attributes = { + .content_type = contentType, + .usage = usage, + .source = AUDIO_SOURCE_DEFAULT, // only used for recording + .flags = flags, // If attributes are set then the other flags parameter is ignored. + .tags = "" + }; + mAudioTrack = new AudioTrack(); mAudioTrack->set( - (audio_stream_type_t) AUDIO_STREAM_MUSIC, + AUDIO_STREAM_DEFAULT, // ignored because we pass attributes below getSampleRate(), format, channelMask, @@ -139,7 +152,7 @@ aaudio_result_t AudioStreamTrack::open(const AudioStreamBuilder& builder) NULL, // DEFAULT audio_offload_info_t AUDIO_UID_INVALID, // DEFAULT uid -1, // DEFAULT pid - NULL, // DEFAULT audio_attributes_t + &attributes, // WARNING - If doNotReconnect set true then audio stops after plugging and unplugging // headphones a few times. false, // DEFAULT doNotReconnect, diff --git a/media/libaaudio/src/utility/AAudioUtilities.cpp b/media/libaaudio/src/utility/AAudioUtilities.cpp index f709f4122c3f52e8a0bdd0a366b6bb31973dbb93..c6adf33aeb2d96e913ae72a7f04ca191f4d352f7 100644 --- a/media/libaaudio/src/utility/AAudioUtilities.cpp +++ b/media/libaaudio/src/utility/AAudioUtilities.cpp @@ -26,6 +26,7 @@ #include "aaudio/AAudio.h" #include #include +#include #include "utility/AAudioUtilities.h" @@ -283,6 +284,61 @@ aaudio_format_t AAudioConvert_androidToAAudioDataFormat(audio_format_t androidFo return aaudioFormat; } +// Make a message string from the condition. +#define STATIC_ASSERT(condition) static_assert(condition, #condition) + +audio_usage_t AAudioConvert_usageToInternal(aaudio_usage_t usage) { + // The public aaudio_content_type_t constants are supposed to have the same + // values as the internal audio_content_type_t values. + STATIC_ASSERT(AAUDIO_USAGE_MEDIA == AUDIO_USAGE_MEDIA); + STATIC_ASSERT(AAUDIO_USAGE_VOICE_COMMUNICATION == AUDIO_USAGE_VOICE_COMMUNICATION); + STATIC_ASSERT(AAUDIO_USAGE_VOICE_COMMUNICATION_SIGNALLING + == AUDIO_USAGE_VOICE_COMMUNICATION_SIGNALLING); + STATIC_ASSERT(AAUDIO_USAGE_ALARM == AUDIO_USAGE_ALARM); + STATIC_ASSERT(AAUDIO_USAGE_NOTIFICATION == AUDIO_USAGE_NOTIFICATION); + STATIC_ASSERT(AAUDIO_USAGE_NOTIFICATION_RINGTONE + == AUDIO_USAGE_NOTIFICATION_TELEPHONY_RINGTONE); + STATIC_ASSERT(AAUDIO_USAGE_NOTIFICATION_EVENT == AUDIO_USAGE_NOTIFICATION_EVENT); + STATIC_ASSERT(AAUDIO_USAGE_ASSISTANCE_ACCESSIBILITY == AUDIO_USAGE_ASSISTANCE_ACCESSIBILITY); + STATIC_ASSERT(AAUDIO_USAGE_ASSISTANCE_NAVIGATION_GUIDANCE + == AUDIO_USAGE_ASSISTANCE_NAVIGATION_GUIDANCE); + STATIC_ASSERT(AAUDIO_USAGE_ASSISTANCE_SONIFICATION == AUDIO_USAGE_ASSISTANCE_SONIFICATION); + STATIC_ASSERT(AAUDIO_USAGE_GAME == AUDIO_USAGE_GAME); + STATIC_ASSERT(AAUDIO_USAGE_ASSISTANT == AUDIO_USAGE_ASSISTANT); + if (usage == AAUDIO_UNSPECIFIED) { + usage = AAUDIO_USAGE_MEDIA; + } + return (audio_usage_t) usage; // same value +} + +audio_content_type_t AAudioConvert_contentTypeToInternal(aaudio_content_type_t contentType) { + // The public aaudio_content_type_t constants are supposed to have the same + // values as the internal audio_content_type_t values. + STATIC_ASSERT(AAUDIO_CONTENT_TYPE_MUSIC == AUDIO_CONTENT_TYPE_MUSIC); + STATIC_ASSERT(AAUDIO_CONTENT_TYPE_SPEECH == AUDIO_CONTENT_TYPE_SPEECH); + STATIC_ASSERT(AAUDIO_CONTENT_TYPE_SONIFICATION == AUDIO_CONTENT_TYPE_SONIFICATION); + STATIC_ASSERT(AAUDIO_CONTENT_TYPE_MOVIE == AUDIO_CONTENT_TYPE_MOVIE); + if (contentType == AAUDIO_UNSPECIFIED) { + contentType = AAUDIO_CONTENT_TYPE_MUSIC; + } + return (audio_content_type_t) contentType; // same value +} + +audio_source_t AAudioConvert_inputPresetToAudioSource(aaudio_input_preset_t preset) { + // The public aaudio_input_preset_t constants are supposed to have the same + // values as the internal audio_source_t values. + STATIC_ASSERT(AAUDIO_UNSPECIFIED == AUDIO_SOURCE_DEFAULT); + STATIC_ASSERT(AAUDIO_INPUT_PRESET_GENERIC == AUDIO_SOURCE_MIC); + STATIC_ASSERT(AAUDIO_INPUT_PRESET_CAMCORDER == AUDIO_SOURCE_CAMCORDER); + STATIC_ASSERT(AAUDIO_INPUT_PRESET_VOICE_RECOGNITION == AUDIO_SOURCE_VOICE_RECOGNITION); + STATIC_ASSERT(AAUDIO_INPUT_PRESET_VOICE_COMMUNICATION == AUDIO_SOURCE_VOICE_COMMUNICATION); + STATIC_ASSERT(AAUDIO_INPUT_PRESET_UNPROCESSED == AUDIO_SOURCE_UNPROCESSED); + if (preset == AAUDIO_UNSPECIFIED) { + preset = AAUDIO_INPUT_PRESET_GENERIC; + } + return (audio_source_t) preset; // same value +} + int32_t AAudioConvert_framesToBytes(int32_t numFrames, int32_t bytesPerFrame, int32_t *sizeInBytes) { diff --git a/media/libaaudio/src/utility/AAudioUtilities.h b/media/libaaudio/src/utility/AAudioUtilities.h index 3afa9761510589c21bcd05ccf6b207bc07b84a2d..f2347f52030a95aa2efb4a3a51291307cf74bc3f 100644 --- a/media/libaaudio/src/utility/AAudioUtilities.h +++ b/media/libaaudio/src/utility/AAudioUtilities.h @@ -167,6 +167,29 @@ audio_format_t AAudioConvert_aaudioToAndroidDataFormat(aaudio_format_t aaudio_fo aaudio_format_t AAudioConvert_androidToAAudioDataFormat(audio_format_t format); + +/** + * Note that this function does not validate the passed in value. + * That is done somewhere else. + * @return internal value + */ + +audio_usage_t AAudioConvert_usageToInternal(aaudio_usage_t usage); + +/** + * Note that this function does not validate the passed in value. + * That is done somewhere else. + * @return internal value + */ +audio_content_type_t AAudioConvert_contentTypeToInternal(aaudio_content_type_t contentType); + +/** + * Note that this function does not validate the passed in value. + * That is done somewhere else. + * @return internal audio source + */ +audio_source_t AAudioConvert_inputPresetToAudioSource(aaudio_input_preset_t preset); + /** * @return the size of a sample of the given format in bytes or AAUDIO_ERROR_ILLEGAL_ARGUMENT */ diff --git a/services/oboeservice/AAudioServiceEndpointMMAP.cpp b/services/oboeservice/AAudioServiceEndpointMMAP.cpp index a61994d2cb77c109b12f35423c69de20bc490fc0..8db17612a45506ac2e52b21763438a9ccb7aba61 100644 --- a/services/oboeservice/AAudioServiceEndpointMMAP.cpp +++ b/services/oboeservice/AAudioServiceEndpointMMAP.cpp @@ -72,13 +72,6 @@ std::string AAudioServiceEndpointMMAP::dump() const { aaudio_result_t AAudioServiceEndpointMMAP::open(const aaudio::AAudioStreamRequest &request) { aaudio_result_t result = AAUDIO_OK; - const audio_attributes_t attributes = { - .content_type = AUDIO_CONTENT_TYPE_MUSIC, - .usage = AUDIO_USAGE_MEDIA, - .source = AUDIO_SOURCE_VOICE_RECOGNITION, - .flags = AUDIO_FLAG_LOW_LATENCY, - .tags = "" - }; audio_config_base_t config; audio_port_handle_t deviceId; @@ -87,6 +80,24 @@ aaudio_result_t AAudioServiceEndpointMMAP::open(const aaudio::AAudioStreamReques copyFrom(request.getConstantConfiguration()); + aaudio_direction_t direction = getDirection(); + + const audio_content_type_t contentType = + AAudioConvert_contentTypeToInternal(getContentType()); + const audio_usage_t usage = (direction == AAUDIO_DIRECTION_OUTPUT) + ? AAudioConvert_usageToInternal(getUsage()) + : AUDIO_USAGE_UNKNOWN; + const audio_source_t source = (direction == AAUDIO_DIRECTION_INPUT) + ? AAudioConvert_inputPresetToAudioSource(getInputPreset()) + : AUDIO_SOURCE_DEFAULT; + + const audio_attributes_t attributes = { + .content_type = contentType, + .usage = usage, + .source = source, + .flags = AUDIO_FLAG_LOW_LATENCY, + .tags = "" + }; mMmapClient.clientUid = request.getUserId(); mMmapClient.clientPid = request.getProcessId(); mMmapClient.packageName.setTo(String16("")); @@ -108,7 +119,6 @@ aaudio_result_t AAudioServiceEndpointMMAP::open(const aaudio::AAudioStreamReques int32_t aaudioSamplesPerFrame = getSamplesPerFrame(); - aaudio_direction_t direction = getDirection(); if (direction == AAUDIO_DIRECTION_OUTPUT) { config.channel_mask = (aaudioSamplesPerFrame == AAUDIO_UNSPECIFIED) ? AUDIO_CHANNEL_OUT_STEREO