// Copyright (C) 2020 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. #pragma once // clang-format off #include PATH(device/google/atv/audio_proxy/AUDIO_PROXY_FILE_VERSION/IAudioProxyStreamOut.h) // clang-format on #include #include #include #include #include using ::android::sp; using ::android::Thread; using ::android::hardware::EventFlag; using ::android::hardware::hidl_bitfield; using ::android::hardware::hidl_string; using ::android::hardware::hidl_vec; using ::android::hardware::kSynchronizedReadWrite; using ::android::hardware::MessageQueue; using ::android::hardware::Return; using ::android::hardware::Void; using namespace ::android::hardware::audio::common::CPP_VERSION; using namespace ::android::hardware::audio::CPP_VERSION; using ::device::google::atv::audio_proxy::AUDIO_PROXY_CPP_VERSION:: IAudioProxyStreamOut; using ::device::google::atv::audio_proxy::AUDIO_PROXY_CPP_VERSION:: IStreamEventListener; namespace audio_proxy { namespace AUDIO_PROXY_CPP_VERSION { class AudioProxyStreamOut; class StreamOutImpl : public IAudioProxyStreamOut { public: using CommandMQ = MessageQueue; using DataMQ = MessageQueue; using StatusMQ = MessageQueue; explicit StreamOutImpl(std::unique_ptr stream); ~StreamOutImpl() override; // IAudioProxyStreamOut implementations: Return setEventListener(const sp& listener); // Methods from ::android::hardware::audio::CPP_VERSION::IStream follow. Return getFrameSize() override; Return getFrameCount() override; Return getBufferSize() override; Return getSampleRate() override; Return getSupportedSampleRates( AudioFormat format, getSupportedSampleRates_cb _hidl_cb) override; Return getSupportedChannelMasks( AudioFormat format, getSupportedChannelMasks_cb _hidl_cb) override; Return setSampleRate(uint32_t sampleRateHz) override; Return> getChannelMask() override; Return setChannelMask(hidl_bitfield mask) override; Return getFormat() override; Return getSupportedFormats(getSupportedFormats_cb _hidl_cb) override; Return setFormat(AudioFormat format) override; Return getAudioProperties(getAudioProperties_cb _hidl_cb) override; Return addEffect(uint64_t effectId) override; Return removeEffect(uint64_t effectId) override; Return standby() override; Return getDevices(getDevices_cb _hidl_cb) override; Return setDevices(const hidl_vec& devices) override; Return getParameters(const hidl_vec& context, const hidl_vec& keys, getParameters_cb _hidl_cb) override; Return setParameters( const hidl_vec& context, const hidl_vec& parameters) override; Return setHwAvSync(uint32_t hwAvSync) override; Return close() override; // Methods from ::android::hardware::audio::CPP_VERSION::IStreamOut follow. Return getLatency() override; Return setVolume(float left, float right) override; Return prepareForWriting(uint32_t frameSize, uint32_t framesCount, prepareForWriting_cb _hidl_cb) override; Return getRenderPosition(getRenderPosition_cb _hidl_cb) override; Return getNextWriteTimestamp( getNextWriteTimestamp_cb _hidl_cb) override; Return setCallback(const sp& callback) override; Return clearCallback() override; Return supportsPauseAndResume( supportsPauseAndResume_cb _hidl_cb) override; Return pause() override; Return resume() override; Return supportsDrain() override; Return drain(AudioDrain type) override; Return flush() override; Return getPresentationPosition( getPresentationPosition_cb _hidl_cb) override; Return start() override; Return stop() override; Return createMmapBuffer(int32_t minSizeFrames, createMmapBuffer_cb _hidl_cb) override; Return getMmapPosition(getMmapPosition_cb _hidl_cb) override; Return updateSourceMetadata( const SourceMetadata& sourceMetadata) override; Return selectPresentation(int32_t presentationId, int32_t programId) override; private: typedef void (*EventFlagDeleter)(EventFlag*); Result closeImpl(); std::unique_ptr mStream; sp mEventListener; std::unique_ptr mCommandMQ; std::unique_ptr mDataMQ; std::unique_ptr mStatusMQ; std::unique_ptr mEventFlag; std::atomic mStopWriteThread = false; sp mWriteThread; }; } // namespace AUDIO_PROXY_CPP_VERSION } // namespace audio_proxy