diff --git a/include/media/AudioPresentationInfo.h b/include/media/AudioPresentationInfo.h new file mode 100644 index 0000000000..e91a992950 --- /dev/null +++ b/include/media/AudioPresentationInfo.h @@ -0,0 +1,79 @@ +/* + * Copyright (C) 2018 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef AUDIO_PRESENTATION_INFO_H_ +#define AUDIO_PRESENTATION_INFO_H_ + +#include +#include + +#include +#include +#include +#include + +namespace android { + +enum mastering_indication { + MASTERING_NOT_INDICATED, + MASTERED_FOR_STEREO, + MASTERED_FOR_SURROUND, + MASTERED_FOR_3D, + MASTERED_FOR_HEADPHONE, +}; + +struct AudioPresentation : public RefBase { + int32_t mPresentationId; + int32_t mProgramId; + KeyedVector mLabels; + String8 mLanguage; + int32_t mMasteringIndication; + bool mAudioDescriptionAvailable; + bool mSpokenSubtitlesAvailable; + bool mDialogueEnhancementAvailable; + + AudioPresentation() { + mPresentationId = -1; + mProgramId = -1; + mLanguage = ""; + mMasteringIndication = MASTERING_NOT_INDICATED; + mAudioDescriptionAvailable = false; + mSpokenSubtitlesAvailable = false; + mDialogueEnhancementAvailable = false; + } +}; + +typedef Vector> AudioPresentations; + +class AudioPresentationInfo : public RefBase { + public: + AudioPresentationInfo(); + + ~AudioPresentationInfo(); + + void addPresentation(sp presentation); + + size_t countPresentations() const; + + const sp getPresentation(size_t index) const; + + private: + AudioPresentations mPresentations; +}; + +} // namespace android + +#endif // AUDIO_PRESENTATION_INFO_H_ diff --git a/media/libaudioclient/AudioTrack.cpp b/media/libaudioclient/AudioTrack.cpp index 7dd3f2912c..55954f244e 100644 --- a/media/libaudioclient/AudioTrack.cpp +++ b/media/libaudioclient/AudioTrack.cpp @@ -29,6 +29,7 @@ #include #include #include +#include #include #include #include @@ -2354,6 +2355,17 @@ status_t AudioTrack::setParameters(const String8& keyValuePairs) return mAudioTrack->setParameters(keyValuePairs); } +status_t AudioTrack::selectPresentation(int presentationId, int programId) +{ + AutoMutex lock(mLock); + AudioParameter param = AudioParameter(); + param.addInt(String8(AudioParameter::keyPresentationId), presentationId); + param.addInt(String8(AudioParameter::keyProgramId), programId); + ALOGV("PresentationId/ProgramId[%s]",param.toString().string()); + + return mAudioTrack->setParameters(param.toString()); +} + VolumeShaper::Status AudioTrack::applyVolumeShaper( const sp& configuration, const sp& operation) diff --git a/media/libaudioclient/include/media/AudioParameter.h b/media/libaudioclient/include/media/AudioParameter.h index 1ace607a2c..59ac1db998 100644 --- a/media/libaudioclient/include/media/AudioParameter.h +++ b/media/libaudioclient/include/media/AudioParameter.h @@ -58,6 +58,12 @@ public: static const char * const keyMonoOutput; static const char * const keyStreamHwAvSync; + // keys for presentation selection + // keyPresentationId: Audio presentation identifier + // keyProgramId: Audio presentation program identifier + static const char * const keyPresentationId; + static const char * const keyProgramId; + // keyStreamConnect / Disconnect: value is an int in audio_devices_t static const char * const keyStreamConnect; static const char * const keyStreamDisconnect; diff --git a/media/libaudioclient/include/media/AudioTrack.h b/media/libaudioclient/include/media/AudioTrack.h index e5bb854780..3eb627d36a 100644 --- a/media/libaudioclient/include/media/AudioTrack.h +++ b/media/libaudioclient/include/media/AudioTrack.h @@ -765,6 +765,9 @@ public: /* Gets the volume shaper state */ sp getVolumeShaperState(int id); + /* Selects the presentation (if available) */ + status_t selectPresentation(int presentationId, int programId); + /* Get parameters */ String8 getParameters(const String8& keys); diff --git a/media/libmedia/AudioParameter.cpp b/media/libmedia/AudioParameter.cpp index 65fc70b89b..cb0e927209 100644 --- a/media/libmedia/AudioParameter.cpp +++ b/media/libmedia/AudioParameter.cpp @@ -34,6 +34,8 @@ const char * const AudioParameter::keyInputSource = AUDIO_PARAMETER_STREAM_INPUT const char * const AudioParameter::keyScreenState = AUDIO_PARAMETER_KEY_SCREEN_STATE; const char * const AudioParameter::keyBtNrec = AUDIO_PARAMETER_KEY_BT_NREC; const char * const AudioParameter::keyHwAvSync = AUDIO_PARAMETER_HW_AV_SYNC; +const char * const AudioParameter::keyPresentationId = AUDIO_PARAMETER_STREAM_PRESENTATION_ID; +const char * const AudioParameter::keyProgramId = AUDIO_PARAMETER_STREAM_PROGRAM_ID; const char * const AudioParameter::keyMonoOutput = AUDIO_PARAMETER_MONO_OUTPUT; const char * const AudioParameter::keyStreamHwAvSync = AUDIO_PARAMETER_STREAM_HW_AV_SYNC; const char * const AudioParameter::keyStreamConnect = AUDIO_PARAMETER_DEVICE_CONNECT; diff --git a/media/libstagefright/Android.bp b/media/libstagefright/Android.bp index 106688a9b6..329b901b01 100644 --- a/media/libstagefright/Android.bp +++ b/media/libstagefright/Android.bp @@ -57,6 +57,7 @@ cc_library_shared { "AACWriter.cpp", "AMRWriter.cpp", "AudioPlayer.cpp", + "AudioPresentationInfo.cpp", "AudioSource.cpp", "BufferImpl.cpp", "CCodec.cpp", diff --git a/media/libstagefright/AudioPresentationInfo.cpp b/media/libstagefright/AudioPresentationInfo.cpp new file mode 100644 index 0000000000..86e1859ce8 --- /dev/null +++ b/media/libstagefright/AudioPresentationInfo.cpp @@ -0,0 +1,45 @@ +/* + * Copyright (C) 2018 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +// #define LOG_NDEBUG 0 +#define LOG_TAG "AudioPresentationInfo" + +#include + +namespace android { + +AudioPresentationInfo::AudioPresentationInfo() { +} + +AudioPresentationInfo::~AudioPresentationInfo() { + mPresentations.clear(); +} + +void AudioPresentationInfo::addPresentation(sp presentation) { + mPresentations.push(presentation); +} + +size_t AudioPresentationInfo::countPresentations() const { + return mPresentations.size(); +} + +// Returns an AudioPresentation for the given valid index +// index must be >=0 and < countPresentations() +const sp AudioPresentationInfo::getPresentation(size_t index) const { + return mPresentations[index]; +} + +} // namespace android