1 // Copyright (C) 2020 The Android Open Source Project 2 // 3 // Licensed under the Apache License, Version 2.0 (the "License"); 4 // you may not use this file except in compliance with the License. 5 // You may obtain a copy of the License at 6 // 7 // http://www.apache.org/licenses/LICENSE-2.0 8 // 9 // Unless required by applicable law or agreed to in writing, software 10 // distributed under the License is distributed on an "AS IS" BASIS, 11 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 // See the License for the specific language governing permissions and 13 // limitations under the License. 14 15 #pragma once 16 17 // clang-format off 18 #include PATH(device/google/atv/audio_proxy/AUDIO_PROXY_FILE_VERSION/IAudioProxyStreamOut.h) 19 // clang-format on 20 21 #include <fmq/EventFlag.h> 22 #include <fmq/MessageQueue.h> 23 #include <hidl/MQDescriptor.h> 24 #include <hidl/Status.h> 25 #include <utils/Thread.h> 26 27 using ::android::sp; 28 using ::android::Thread; 29 using ::android::hardware::EventFlag; 30 using ::android::hardware::hidl_bitfield; 31 using ::android::hardware::hidl_string; 32 using ::android::hardware::hidl_vec; 33 using ::android::hardware::kSynchronizedReadWrite; 34 using ::android::hardware::MessageQueue; 35 using ::android::hardware::Return; 36 using ::android::hardware::Void; 37 using namespace ::android::hardware::audio::common::CPP_VERSION; 38 using namespace ::android::hardware::audio::CPP_VERSION; 39 40 using ::device::google::atv::audio_proxy::AUDIO_PROXY_CPP_VERSION:: 41 IAudioProxyStreamOut; 42 using ::device::google::atv::audio_proxy::AUDIO_PROXY_CPP_VERSION:: 43 IStreamEventListener; 44 45 namespace audio_proxy { 46 namespace AUDIO_PROXY_CPP_VERSION { 47 class AudioProxyStreamOut; 48 49 class StreamOutImpl : public IAudioProxyStreamOut { 50 public: 51 using CommandMQ = MessageQueue<WriteCommand, kSynchronizedReadWrite>; 52 using DataMQ = MessageQueue<uint8_t, kSynchronizedReadWrite>; 53 using StatusMQ = MessageQueue<WriteStatus, kSynchronizedReadWrite>; 54 55 explicit StreamOutImpl(std::unique_ptr<AudioProxyStreamOut> stream); 56 ~StreamOutImpl() override; 57 58 // IAudioProxyStreamOut implementations: 59 Return<void> setEventListener(const sp<IStreamEventListener>& listener); 60 61 // Methods from ::android::hardware::audio::CPP_VERSION::IStream follow. 62 Return<uint64_t> getFrameSize() override; 63 Return<uint64_t> getFrameCount() override; 64 Return<uint64_t> getBufferSize() override; 65 Return<uint32_t> getSampleRate() override; 66 Return<void> getSupportedSampleRates( 67 AudioFormat format, getSupportedSampleRates_cb _hidl_cb) override; 68 Return<void> getSupportedChannelMasks( 69 AudioFormat format, getSupportedChannelMasks_cb _hidl_cb) override; 70 Return<Result> setSampleRate(uint32_t sampleRateHz) override; 71 Return<hidl_bitfield<AudioChannelMask>> getChannelMask() override; 72 Return<Result> setChannelMask(hidl_bitfield<AudioChannelMask> mask) override; 73 Return<AudioFormat> getFormat() override; 74 Return<void> getSupportedFormats(getSupportedFormats_cb _hidl_cb) override; 75 Return<Result> setFormat(AudioFormat format) override; 76 Return<void> getAudioProperties(getAudioProperties_cb _hidl_cb) override; 77 Return<Result> addEffect(uint64_t effectId) override; 78 Return<Result> removeEffect(uint64_t effectId) override; 79 Return<Result> standby() override; 80 Return<void> getDevices(getDevices_cb _hidl_cb) override; 81 Return<Result> setDevices(const hidl_vec<DeviceAddress>& devices) override; 82 Return<void> getParameters(const hidl_vec<ParameterValue>& context, 83 const hidl_vec<hidl_string>& keys, 84 getParameters_cb _hidl_cb) override; 85 Return<Result> setParameters( 86 const hidl_vec<ParameterValue>& context, 87 const hidl_vec<ParameterValue>& parameters) override; 88 Return<Result> setHwAvSync(uint32_t hwAvSync) override; 89 Return<Result> close() override; 90 91 // Methods from ::android::hardware::audio::CPP_VERSION::IStreamOut follow. 92 Return<uint32_t> getLatency() override; 93 Return<Result> setVolume(float left, float right) override; 94 Return<void> prepareForWriting(uint32_t frameSize, uint32_t framesCount, 95 prepareForWriting_cb _hidl_cb) override; 96 Return<void> getRenderPosition(getRenderPosition_cb _hidl_cb) override; 97 Return<void> getNextWriteTimestamp( 98 getNextWriteTimestamp_cb _hidl_cb) override; 99 Return<Result> setCallback(const sp<IStreamOutCallback>& callback) override; 100 Return<Result> clearCallback() override; 101 Return<void> supportsPauseAndResume( 102 supportsPauseAndResume_cb _hidl_cb) override; 103 Return<Result> pause() override; 104 Return<Result> resume() override; 105 Return<bool> supportsDrain() override; 106 Return<Result> drain(AudioDrain type) override; 107 Return<Result> flush() override; 108 Return<void> getPresentationPosition( 109 getPresentationPosition_cb _hidl_cb) override; 110 Return<Result> start() override; 111 Return<Result> stop() override; 112 Return<void> createMmapBuffer(int32_t minSizeFrames, 113 createMmapBuffer_cb _hidl_cb) override; 114 Return<void> getMmapPosition(getMmapPosition_cb _hidl_cb) override; 115 Return<void> updateSourceMetadata( 116 const SourceMetadata& sourceMetadata) override; 117 Return<Result> selectPresentation(int32_t presentationId, 118 int32_t programId) override; 119 120 private: 121 typedef void (*EventFlagDeleter)(EventFlag*); 122 123 Result closeImpl(); 124 125 std::unique_ptr<AudioProxyStreamOut> mStream; 126 sp<IStreamEventListener> mEventListener; 127 128 std::unique_ptr<CommandMQ> mCommandMQ; 129 std::unique_ptr<DataMQ> mDataMQ; 130 std::unique_ptr<StatusMQ> mStatusMQ; 131 std::unique_ptr<EventFlag, EventFlagDeleter> mEventFlag; 132 std::atomic<bool> mStopWriteThread = false; 133 sp<Thread> mWriteThread; 134 }; 135 136 } // namespace AUDIO_PROXY_CPP_VERSION 137 } // namespace audio_proxy 138