/* * 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 ANDROID_HARDWARE_AUDIO_STREAMOUT_H #define ANDROID_HARDWARE_AUDIO_STREAMOUT_H #include PATH(android/hardware/audio/FILE_VERSION/IStreamOut.h) #include "Device.h" #include "Stream.h" #include #include #include #include #include #include #include #include namespace android { namespace hardware { namespace audio { namespace CPP_VERSION { namespace implementation { using ::android::sp; using ::android::hardware::hidl_string; using ::android::hardware::hidl_vec; using ::android::hardware::Return; using ::android::hardware::Void; using namespace ::android::hardware::audio::common::COMMON_TYPES_CPP_VERSION; using namespace ::android::hardware::audio::CORE_TYPES_CPP_VERSION; using namespace ::android::hardware::audio::CPP_VERSION; struct StreamOut : public IStreamOut { typedef MessageQueue CommandMQ; typedef MessageQueue DataMQ; typedef MessageQueue StatusMQ; StreamOut(const sp& device, audio_stream_out_t* stream); // Methods from ::android::hardware::audio::CPP_VERSION::IStream follow. Return getFrameSize() override; Return getFrameCount() override; Return getBufferSize() override; #if MAJOR_VERSION <= 6 Return getSampleRate() override; #if MAJOR_VERSION == 2 Return getSupportedSampleRates(getSupportedSampleRates_cb _hidl_cb) override; Return getSupportedChannelMasks(getSupportedChannelMasks_cb _hidl_cb) override; #endif Return getSupportedSampleRates(AudioFormat format, getSupportedSampleRates_cb _hidl_cb); Return getSupportedChannelMasks(AudioFormat format, getSupportedChannelMasks_cb _hidl_cb); Return setSampleRate(uint32_t sampleRateHz) override; Return getChannelMask() override; Return setChannelMask(AudioChannelBitfield mask) override; Return getFormat() override; Return getSupportedFormats(getSupportedFormats_cb _hidl_cb) override; Return setFormat(AudioFormat format) override; #else Return getSupportedProfiles(getSupportedProfiles_cb _hidl_cb) override; Return setAudioProperties(const AudioConfigBaseOptional& config) override; #endif // MAJOR_VERSION <= 6 Return getAudioProperties(getAudioProperties_cb _hidl_cb) override; Return addEffect(uint64_t effectId) override; Return removeEffect(uint64_t effectId) override; Return standby() override; #if MAJOR_VERSION == 2 Return getDevice() override; Return setDevice(const DeviceAddress& address) override; Return getParameters(const hidl_vec& keys, getParameters_cb _hidl_cb) override; Return setParameters(const hidl_vec& parameters) override; Return setConnectedState(const DeviceAddress& address, bool connected) override; #elif MAJOR_VERSION >= 4 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; #endif Return setHwAvSync(uint32_t hwAvSync) override; Return close() override; Return debug(const hidl_handle& fd, const hidl_vec& options) override; #if MAJOR_VERSION == 2 Return debugDump(const hidl_handle& fd) override; #endif // 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; #if MAJOR_VERSION >= 4 Return selectPresentation(int32_t presentationId, int32_t programId) override; #if MAJOR_VERSION <= 6 Return updateSourceMetadata(const SourceMetadata& sourceMetadata) override; #else Return updateSourceMetadata(const SourceMetadata& sourceMetadata) override; #endif #endif // MAJOR_VERSION >= 4 #if MAJOR_VERSION >= 6 Return getDualMonoMode(getDualMonoMode_cb _hidl_cb) override; Return setDualMonoMode(DualMonoMode mode) override; Return getAudioDescriptionMixLevel(getAudioDescriptionMixLevel_cb _hidl_cb) override; Return setAudioDescriptionMixLevel(float leveldB) override; Return getPlaybackRateParameters(getPlaybackRateParameters_cb _hidl_cb) override; Return setPlaybackRateParameters(const PlaybackRate& playbackRate) override; #endif static Result getPresentationPositionImpl(audio_stream_out_t* stream, uint64_t* frames, TimeSpec* timeStamp); #if MAJOR_VERSION >= 6 Return setEventCallback(const sp& callback) override; #endif private: #if MAJOR_VERSION >= 4 Result doUpdateSourceMetadata(const SourceMetadata& sourceMetadata); #if MAJOR_VERSION >= 7 Result doUpdateSourceMetadataV7(const SourceMetadata& sourceMetadata); #if MAJOR_VERSION == 7 && MINOR_VERSION == 1 Return setLatencyMode(LatencyMode mode) override; Return getRecommendedLatencyModes(getRecommendedLatencyModes_cb _hidl_cb) override; Return setLatencyModeCallback( const sp& callback) override; #endif #endif #endif // MAJOR_VERSION >= 4 const sp mDevice; audio_stream_out_t* mStream; const sp mStreamCommon; const sp> mStreamMmap; mediautils::atomic_sp mCallback; // for non-blocking write and drain #if MAJOR_VERSION >= 6 mediautils::atomic_sp mEventCallback; #if MAJOR_VERSION == 7 && MINOR_VERSION == 1 mediautils::atomic_sp mLatencyModeCallback; #endif #endif std::unique_ptr mCommandMQ; std::unique_ptr mDataMQ; std::unique_ptr mStatusMQ; EventFlag* mEfGroup; std::atomic mStopWriteThread; sp mWriteThread; virtual ~StreamOut(); static int asyncCallback(stream_callback_event_t event, void* param, void* cookie); #if MAJOR_VERSION >= 6 static int asyncEventCallback(stream_event_callback_type_t event, void* param, void* cookie); #if MAJOR_VERSION == 7 && MINOR_VERSION == 1 static void latencyModeCallback(audio_latency_mode_t* modes, size_t num_modes, void* cookie); #endif #endif }; } // namespace implementation } // namespace CPP_VERSION } // namespace audio } // namespace hardware } // namespace android #endif // ANDROID_HARDWARE_AUDIO_STREAMOUT_H