Loading media/libaudiohal/impl/DeviceHalAidl.cpp +5 −2 Original line number Diff line number Diff line Loading @@ -753,8 +753,11 @@ int32_t DeviceHalAidl::getAAudioHardwareBurstMinUsec() { error::Result<audio_hw_sync_t> DeviceHalAidl::getHwAvSync() { TIME_CHECK(); ALOGE("%s not implemented yet", __func__); return base::unexpected(INVALID_OPERATION); if (!mModule) return NO_INIT; int32_t aidlHwAvSync; RETURN_STATUS_IF_ERROR(statusTFromBinderStatus(mModule->generateHwAvSyncId(&aidlHwAvSync))); return VALUE_OR_RETURN_STATUS( ::aidl::android::aidl2legacy_int32_t_audio_hw_sync_t(aidlHwAvSync)); } status_t DeviceHalAidl::dump(int fd, const Vector<String16>& args) { Loading media/libaudiohal/impl/StreamHalAidl.cpp +87 −66 Original line number Diff line number Diff line Loading @@ -120,11 +120,45 @@ status_t StreamHalAidl::getAudioProperties(audio_config_base_t *configBase) { return OK; } status_t StreamHalAidl::setParameters(const String8& kvPairs __unused) { ALOGD("%p %s::%s", this, getClassName().c_str(), __func__); namespace { // 'action' must accept a value of type 'T' and return 'status_t'. // The function returns 'true' if the parameter was found, and the action has succeeded. // The function returns 'false' if the parameter was not found. // Any errors get propagated, if there are errors it means the parameter was found. template<typename T, typename F> error::Result<bool> filterOutAndProcessParameter( AudioParameter& parameters, const String8& key, const F& action) { if (parameters.containsKey(key)) { T value; status_t status = parameters.get(key, value); if (status == OK) { parameters.remove(key); status = action(value); if (status == OK) return true; } return base::unexpected(status); } return false; } } // namespace status_t StreamHalAidl::setParameters(const String8& kvPairs) { TIME_CHECK(); if (!mStream) return NO_INIT; ALOGE("%s not implemented yet", __func__); AudioParameter parameters(kvPairs); ALOGD("%s: parameters: %s", __func__, parameters.toString().c_str()); (void)VALUE_OR_RETURN_STATUS(filterOutAndProcessParameter<int>( parameters, String8(AudioParameter::keyStreamHwAvSync), [&](int hwAvSyncId) { return statusTFromBinderStatus(mStream->updateHwAvSyncId(hwAvSyncId)); })); ALOGW_IF(parameters.size() != 0, "%s: unknown parameters, ignored: %s", __func__, parameters.toString().c_str()); return OK; } Loading Loading @@ -735,70 +769,57 @@ status_t StreamOutHalAidl::exit() { status_t StreamOutHalAidl::filterAndUpdateOffloadMetadata(AudioParameter ¶meters) { TIME_CHECK(); if (parameters.containsKey(String8(AudioParameter::keyOffloadCodecAverageBitRate)) || parameters.containsKey(String8(AudioParameter::keyOffloadCodecSampleRate)) || parameters.containsKey(String8(AudioParameter::keyOffloadCodecChannels)) || parameters.containsKey(String8(AudioParameter::keyOffloadCodecDelaySamples)) || parameters.containsKey(String8(AudioParameter::keyOffloadCodecPaddingSamples))) { int value = 0; if (parameters.getInt(String8(AudioParameter::keyOffloadCodecAverageBitRate), value) == NO_ERROR) { if (value <= 0) { return BAD_VALUE; } mOffloadMetadata.averageBitRatePerSecond = value; parameters.remove(String8(AudioParameter::keyOffloadCodecAverageBitRate)); } if (parameters.getInt(String8(AudioParameter::keyOffloadCodecSampleRate), value) == NO_ERROR) { if (value <= 0) { return BAD_VALUE; } mOffloadMetadata.sampleRate = value; parameters.remove(String8(AudioParameter::keyOffloadCodecSampleRate)); } if (parameters.getInt(String8(AudioParameter::keyOffloadCodecChannels), value) == NO_ERROR) { if (value <= 0) { return BAD_VALUE; } audio_channel_mask_t channel_mask = audio_channel_out_mask_from_count(static_cast<uint32_t>(value)); if (channel_mask == AUDIO_CHANNEL_INVALID) { return BAD_VALUE; } mOffloadMetadata.channelMask = VALUE_OR_RETURN_STATUS( bool updateMetadata = false; if (VALUE_OR_RETURN_STATUS(filterOutAndProcessParameter<int>( parameters, String8(AudioParameter::keyOffloadCodecAverageBitRate), [&](int value) { return value > 0 ? mOffloadMetadata.averageBitRatePerSecond = value, OK : BAD_VALUE; }))) { updateMetadata = true; } if (VALUE_OR_RETURN_STATUS(filterOutAndProcessParameter<int>( parameters, String8(AudioParameter::keyOffloadCodecSampleRate), [&](int value) { return value > 0 ? mOffloadMetadata.sampleRate = value, OK : BAD_VALUE; }))) { updateMetadata = true; } if (VALUE_OR_RETURN_STATUS(filterOutAndProcessParameter<int>( parameters, String8(AudioParameter::keyOffloadCodecChannels), [&](int value) -> status_t { if (value > 0) { audio_channel_mask_t channel_mask = audio_channel_out_mask_from_count( static_cast<uint32_t>(value)); if (channel_mask == AUDIO_CHANNEL_INVALID) return BAD_VALUE; mOffloadMetadata.channelMask = VALUE_OR_RETURN_STATUS( ::aidl::android::legacy2aidl_audio_channel_mask_t_AudioChannelLayout( channel_mask, false)); parameters.remove(String8(AudioParameter::keyOffloadCodecChannels)); channel_mask, false /*isInput*/)); } // The legacy keys are misnamed. The delay and padding are in frame. if (parameters.getInt(String8(AudioParameter::keyOffloadCodecDelaySamples), value) == NO_ERROR) { if (value < 0) { return BAD_VALUE; } mOffloadMetadata.delayFrames = value; parameters.remove(String8(AudioParameter::keyOffloadCodecDelaySamples)); } if (parameters.getInt(String8(AudioParameter::keyOffloadCodecPaddingSamples), value) == NO_ERROR) { if (value < 0) { return BAD_VALUE; } mOffloadMetadata.paddingFrames = value; parameters.remove(String8(AudioParameter::keyOffloadCodecPaddingSamples)); } }))) { updateMetadata = true; } if (VALUE_OR_RETURN_STATUS(filterOutAndProcessParameter<int>( parameters, String8(AudioParameter::keyOffloadCodecDelaySamples), [&](int value) { // The legacy keys are misnamed, the value is in frames. return value > 0 ? mOffloadMetadata.delayFrames = value, OK : BAD_VALUE; }))) { updateMetadata = true; } if (VALUE_OR_RETURN_STATUS(filterOutAndProcessParameter<int>( parameters, String8(AudioParameter::keyOffloadCodecPaddingSamples), [&](int value) { // The legacy keys are misnamed, the value is in frames. return value > 0 ? mOffloadMetadata.paddingFrames = value, OK : BAD_VALUE; }))) { updateMetadata = true; } if (updateMetadata) { ALOGD("%s set offload metadata %s", __func__, mOffloadMetadata.toString().c_str()); status_t status = statusTFromBinderStatus(mStream->updateOffloadMetadata(mOffloadMetadata)); if (status != OK) { if (status_t status = statusTFromBinderStatus( mStream->updateOffloadMetadata(mOffloadMetadata)); status != OK) { ALOGE("%s: updateOffloadMetadata failed %d", __func__, status); return status; } Loading media/libmediahelper/include/media/AudioParameter.h +6 −0 Original line number Diff line number Diff line Loading @@ -123,6 +123,12 @@ public: status_t remove(const String8& key); status_t get(const String8& key, int& value) const { return getInt(key, value); } status_t get(const String8& key, float& value) const { return getFloat(key, value); } status_t get(const String8& key, String8& value) const; status_t getInt(const String8& key, int& value) const; status_t getFloat(const String8& key, float& value) const; Loading Loading
media/libaudiohal/impl/DeviceHalAidl.cpp +5 −2 Original line number Diff line number Diff line Loading @@ -753,8 +753,11 @@ int32_t DeviceHalAidl::getAAudioHardwareBurstMinUsec() { error::Result<audio_hw_sync_t> DeviceHalAidl::getHwAvSync() { TIME_CHECK(); ALOGE("%s not implemented yet", __func__); return base::unexpected(INVALID_OPERATION); if (!mModule) return NO_INIT; int32_t aidlHwAvSync; RETURN_STATUS_IF_ERROR(statusTFromBinderStatus(mModule->generateHwAvSyncId(&aidlHwAvSync))); return VALUE_OR_RETURN_STATUS( ::aidl::android::aidl2legacy_int32_t_audio_hw_sync_t(aidlHwAvSync)); } status_t DeviceHalAidl::dump(int fd, const Vector<String16>& args) { Loading
media/libaudiohal/impl/StreamHalAidl.cpp +87 −66 Original line number Diff line number Diff line Loading @@ -120,11 +120,45 @@ status_t StreamHalAidl::getAudioProperties(audio_config_base_t *configBase) { return OK; } status_t StreamHalAidl::setParameters(const String8& kvPairs __unused) { ALOGD("%p %s::%s", this, getClassName().c_str(), __func__); namespace { // 'action' must accept a value of type 'T' and return 'status_t'. // The function returns 'true' if the parameter was found, and the action has succeeded. // The function returns 'false' if the parameter was not found. // Any errors get propagated, if there are errors it means the parameter was found. template<typename T, typename F> error::Result<bool> filterOutAndProcessParameter( AudioParameter& parameters, const String8& key, const F& action) { if (parameters.containsKey(key)) { T value; status_t status = parameters.get(key, value); if (status == OK) { parameters.remove(key); status = action(value); if (status == OK) return true; } return base::unexpected(status); } return false; } } // namespace status_t StreamHalAidl::setParameters(const String8& kvPairs) { TIME_CHECK(); if (!mStream) return NO_INIT; ALOGE("%s not implemented yet", __func__); AudioParameter parameters(kvPairs); ALOGD("%s: parameters: %s", __func__, parameters.toString().c_str()); (void)VALUE_OR_RETURN_STATUS(filterOutAndProcessParameter<int>( parameters, String8(AudioParameter::keyStreamHwAvSync), [&](int hwAvSyncId) { return statusTFromBinderStatus(mStream->updateHwAvSyncId(hwAvSyncId)); })); ALOGW_IF(parameters.size() != 0, "%s: unknown parameters, ignored: %s", __func__, parameters.toString().c_str()); return OK; } Loading Loading @@ -735,70 +769,57 @@ status_t StreamOutHalAidl::exit() { status_t StreamOutHalAidl::filterAndUpdateOffloadMetadata(AudioParameter ¶meters) { TIME_CHECK(); if (parameters.containsKey(String8(AudioParameter::keyOffloadCodecAverageBitRate)) || parameters.containsKey(String8(AudioParameter::keyOffloadCodecSampleRate)) || parameters.containsKey(String8(AudioParameter::keyOffloadCodecChannels)) || parameters.containsKey(String8(AudioParameter::keyOffloadCodecDelaySamples)) || parameters.containsKey(String8(AudioParameter::keyOffloadCodecPaddingSamples))) { int value = 0; if (parameters.getInt(String8(AudioParameter::keyOffloadCodecAverageBitRate), value) == NO_ERROR) { if (value <= 0) { return BAD_VALUE; } mOffloadMetadata.averageBitRatePerSecond = value; parameters.remove(String8(AudioParameter::keyOffloadCodecAverageBitRate)); } if (parameters.getInt(String8(AudioParameter::keyOffloadCodecSampleRate), value) == NO_ERROR) { if (value <= 0) { return BAD_VALUE; } mOffloadMetadata.sampleRate = value; parameters.remove(String8(AudioParameter::keyOffloadCodecSampleRate)); } if (parameters.getInt(String8(AudioParameter::keyOffloadCodecChannels), value) == NO_ERROR) { if (value <= 0) { return BAD_VALUE; } audio_channel_mask_t channel_mask = audio_channel_out_mask_from_count(static_cast<uint32_t>(value)); if (channel_mask == AUDIO_CHANNEL_INVALID) { return BAD_VALUE; } mOffloadMetadata.channelMask = VALUE_OR_RETURN_STATUS( bool updateMetadata = false; if (VALUE_OR_RETURN_STATUS(filterOutAndProcessParameter<int>( parameters, String8(AudioParameter::keyOffloadCodecAverageBitRate), [&](int value) { return value > 0 ? mOffloadMetadata.averageBitRatePerSecond = value, OK : BAD_VALUE; }))) { updateMetadata = true; } if (VALUE_OR_RETURN_STATUS(filterOutAndProcessParameter<int>( parameters, String8(AudioParameter::keyOffloadCodecSampleRate), [&](int value) { return value > 0 ? mOffloadMetadata.sampleRate = value, OK : BAD_VALUE; }))) { updateMetadata = true; } if (VALUE_OR_RETURN_STATUS(filterOutAndProcessParameter<int>( parameters, String8(AudioParameter::keyOffloadCodecChannels), [&](int value) -> status_t { if (value > 0) { audio_channel_mask_t channel_mask = audio_channel_out_mask_from_count( static_cast<uint32_t>(value)); if (channel_mask == AUDIO_CHANNEL_INVALID) return BAD_VALUE; mOffloadMetadata.channelMask = VALUE_OR_RETURN_STATUS( ::aidl::android::legacy2aidl_audio_channel_mask_t_AudioChannelLayout( channel_mask, false)); parameters.remove(String8(AudioParameter::keyOffloadCodecChannels)); channel_mask, false /*isInput*/)); } // The legacy keys are misnamed. The delay and padding are in frame. if (parameters.getInt(String8(AudioParameter::keyOffloadCodecDelaySamples), value) == NO_ERROR) { if (value < 0) { return BAD_VALUE; } mOffloadMetadata.delayFrames = value; parameters.remove(String8(AudioParameter::keyOffloadCodecDelaySamples)); } if (parameters.getInt(String8(AudioParameter::keyOffloadCodecPaddingSamples), value) == NO_ERROR) { if (value < 0) { return BAD_VALUE; } mOffloadMetadata.paddingFrames = value; parameters.remove(String8(AudioParameter::keyOffloadCodecPaddingSamples)); } }))) { updateMetadata = true; } if (VALUE_OR_RETURN_STATUS(filterOutAndProcessParameter<int>( parameters, String8(AudioParameter::keyOffloadCodecDelaySamples), [&](int value) { // The legacy keys are misnamed, the value is in frames. return value > 0 ? mOffloadMetadata.delayFrames = value, OK : BAD_VALUE; }))) { updateMetadata = true; } if (VALUE_OR_RETURN_STATUS(filterOutAndProcessParameter<int>( parameters, String8(AudioParameter::keyOffloadCodecPaddingSamples), [&](int value) { // The legacy keys are misnamed, the value is in frames. return value > 0 ? mOffloadMetadata.paddingFrames = value, OK : BAD_VALUE; }))) { updateMetadata = true; } if (updateMetadata) { ALOGD("%s set offload metadata %s", __func__, mOffloadMetadata.toString().c_str()); status_t status = statusTFromBinderStatus(mStream->updateOffloadMetadata(mOffloadMetadata)); if (status != OK) { if (status_t status = statusTFromBinderStatus( mStream->updateOffloadMetadata(mOffloadMetadata)); status != OK) { ALOGE("%s: updateOffloadMetadata failed %d", __func__, status); return status; } Loading
media/libmediahelper/include/media/AudioParameter.h +6 −0 Original line number Diff line number Diff line Loading @@ -123,6 +123,12 @@ public: status_t remove(const String8& key); status_t get(const String8& key, int& value) const { return getInt(key, value); } status_t get(const String8& key, float& value) const { return getFloat(key, value); } status_t get(const String8& key, String8& value) const; status_t getInt(const String8& key, int& value) const; status_t getFloat(const String8& key, float& value) const; Loading