• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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