110548295023bee99108e418499aff09fe578211eMikhail Naganov/* 210548295023bee99108e418499aff09fe578211eMikhail Naganov * Copyright (C) 2016 The Android Open Source Project 310548295023bee99108e418499aff09fe578211eMikhail Naganov * 410548295023bee99108e418499aff09fe578211eMikhail Naganov * Licensed under the Apache License, Version 2.0 (the "License"); 510548295023bee99108e418499aff09fe578211eMikhail Naganov * you may not use this file except in compliance with the License. 610548295023bee99108e418499aff09fe578211eMikhail Naganov * You may obtain a copy of the License at 710548295023bee99108e418499aff09fe578211eMikhail Naganov * 810548295023bee99108e418499aff09fe578211eMikhail Naganov * http://www.apache.org/licenses/LICENSE-2.0 910548295023bee99108e418499aff09fe578211eMikhail Naganov * 1010548295023bee99108e418499aff09fe578211eMikhail Naganov * Unless required by applicable law or agreed to in writing, software 1110548295023bee99108e418499aff09fe578211eMikhail Naganov * distributed under the License is distributed on an "AS IS" BASIS, 1210548295023bee99108e418499aff09fe578211eMikhail Naganov * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1310548295023bee99108e418499aff09fe578211eMikhail Naganov * See the License for the specific language governing permissions and 1410548295023bee99108e418499aff09fe578211eMikhail Naganov * limitations under the License. 1510548295023bee99108e418499aff09fe578211eMikhail Naganov */ 1610548295023bee99108e418499aff09fe578211eMikhail Naganov 17d6e4f03acf5fa1e76b75e33af7a26f248a92be9aSteven Moreland#ifndef ANDROID_HARDWARE_AUDIO_V2_0_STREAMIN_H 18d6e4f03acf5fa1e76b75e33af7a26f248a92be9aSteven Moreland#define ANDROID_HARDWARE_AUDIO_V2_0_STREAMIN_H 1910548295023bee99108e418499aff09fe578211eMikhail Naganov 20b29438ef70549a331d11c0384c53cf1dc6e7f0beMikhail Naganov#include <atomic> 21b29438ef70549a331d11c0384c53cf1dc6e7f0beMikhail Naganov#include <memory> 2210548295023bee99108e418499aff09fe578211eMikhail Naganov 23b29438ef70549a331d11c0384c53cf1dc6e7f0beMikhail Naganov#include <android/hardware/audio/2.0/IStreamIn.h> 2410548295023bee99108e418499aff09fe578211eMikhail Naganov#include <hidl/MQDescriptor.h> 25b29438ef70549a331d11c0384c53cf1dc6e7f0beMikhail Naganov#include <fmq/EventFlag.h> 26b29438ef70549a331d11c0384c53cf1dc6e7f0beMikhail Naganov#include <fmq/MessageQueue.h> 27b29438ef70549a331d11c0384c53cf1dc6e7f0beMikhail Naganov#include <hidl/Status.h> 28b29438ef70549a331d11c0384c53cf1dc6e7f0beMikhail Naganov#include <utils/Thread.h> 2910548295023bee99108e418499aff09fe578211eMikhail Naganov 30936279e1ffe6bf7e842c46f9a94d98a48dce6754Mikhail Naganov#include "Device.h" 3110548295023bee99108e418499aff09fe578211eMikhail Naganov#include "Stream.h" 3210548295023bee99108e418499aff09fe578211eMikhail Naganov 3310548295023bee99108e418499aff09fe578211eMikhail Naganovnamespace android { 3410548295023bee99108e418499aff09fe578211eMikhail Naganovnamespace hardware { 3510548295023bee99108e418499aff09fe578211eMikhail Naganovnamespace audio { 3610548295023bee99108e418499aff09fe578211eMikhail Naganovnamespace V2_0 { 3710548295023bee99108e418499aff09fe578211eMikhail Naganovnamespace implementation { 3810548295023bee99108e418499aff09fe578211eMikhail Naganov 3910548295023bee99108e418499aff09fe578211eMikhail Naganovusing ::android::hardware::audio::common::V2_0::AudioChannelMask; 4010548295023bee99108e418499aff09fe578211eMikhail Naganovusing ::android::hardware::audio::common::V2_0::AudioDevice; 4110548295023bee99108e418499aff09fe578211eMikhail Naganovusing ::android::hardware::audio::common::V2_0::AudioFormat; 4210548295023bee99108e418499aff09fe578211eMikhail Naganovusing ::android::hardware::audio::common::V2_0::AudioSource; 4310548295023bee99108e418499aff09fe578211eMikhail Naganovusing ::android::hardware::audio::V2_0::DeviceAddress; 4410548295023bee99108e418499aff09fe578211eMikhail Naganovusing ::android::hardware::audio::V2_0::IStream; 4510548295023bee99108e418499aff09fe578211eMikhail Naganovusing ::android::hardware::audio::V2_0::IStreamIn; 4610548295023bee99108e418499aff09fe578211eMikhail Naganovusing ::android::hardware::audio::V2_0::ParameterValue; 4710548295023bee99108e418499aff09fe578211eMikhail Naganovusing ::android::hardware::audio::V2_0::Result; 4810548295023bee99108e418499aff09fe578211eMikhail Naganovusing ::android::hardware::Return; 4910548295023bee99108e418499aff09fe578211eMikhail Naganovusing ::android::hardware::Void; 5010548295023bee99108e418499aff09fe578211eMikhail Naganovusing ::android::hardware::hidl_vec; 5110548295023bee99108e418499aff09fe578211eMikhail Naganovusing ::android::hardware::hidl_string; 5210548295023bee99108e418499aff09fe578211eMikhail Naganovusing ::android::sp; 5310548295023bee99108e418499aff09fe578211eMikhail Naganov 5410548295023bee99108e418499aff09fe578211eMikhail Naganovstruct StreamIn : public IStreamIn { 55a468fa84d13b085b1808f20f70d22ed9dbe3f3ebMikhail Naganov typedef MessageQueue<ReadParameters, kSynchronizedReadWrite> CommandMQ; 56b29438ef70549a331d11c0384c53cf1dc6e7f0beMikhail Naganov typedef MessageQueue<uint8_t, kSynchronizedReadWrite> DataMQ; 57b29438ef70549a331d11c0384c53cf1dc6e7f0beMikhail Naganov typedef MessageQueue<ReadStatus, kSynchronizedReadWrite> StatusMQ; 58b29438ef70549a331d11c0384c53cf1dc6e7f0beMikhail Naganov 59936279e1ffe6bf7e842c46f9a94d98a48dce6754Mikhail Naganov StreamIn(const sp<Device>& device, audio_stream_in_t* stream); 6010548295023bee99108e418499aff09fe578211eMikhail Naganov 6110548295023bee99108e418499aff09fe578211eMikhail Naganov // Methods from ::android::hardware::audio::V2_0::IStream follow. 6210548295023bee99108e418499aff09fe578211eMikhail Naganov Return<uint64_t> getFrameSize() override; 6310548295023bee99108e418499aff09fe578211eMikhail Naganov Return<uint64_t> getFrameCount() override; 6410548295023bee99108e418499aff09fe578211eMikhail Naganov Return<uint64_t> getBufferSize() override; 6510548295023bee99108e418499aff09fe578211eMikhail Naganov Return<uint32_t> getSampleRate() override; 6610548295023bee99108e418499aff09fe578211eMikhail Naganov Return<void> getSupportedSampleRates(getSupportedSampleRates_cb _hidl_cb) override; 6710548295023bee99108e418499aff09fe578211eMikhail Naganov Return<Result> setSampleRate(uint32_t sampleRateHz) override; 6810548295023bee99108e418499aff09fe578211eMikhail Naganov Return<AudioChannelMask> getChannelMask() override; 6910548295023bee99108e418499aff09fe578211eMikhail Naganov Return<void> getSupportedChannelMasks(getSupportedChannelMasks_cb _hidl_cb) override; 7010548295023bee99108e418499aff09fe578211eMikhail Naganov Return<Result> setChannelMask(AudioChannelMask mask) override; 7110548295023bee99108e418499aff09fe578211eMikhail Naganov Return<AudioFormat> getFormat() override; 7210548295023bee99108e418499aff09fe578211eMikhail Naganov Return<void> getSupportedFormats(getSupportedFormats_cb _hidl_cb) override; 7310548295023bee99108e418499aff09fe578211eMikhail Naganov Return<Result> setFormat(AudioFormat format) override; 7410548295023bee99108e418499aff09fe578211eMikhail Naganov Return<void> getAudioProperties(getAudioProperties_cb _hidl_cb) override; 7510548295023bee99108e418499aff09fe578211eMikhail Naganov Return<Result> addEffect(uint64_t effectId) override; 7610548295023bee99108e418499aff09fe578211eMikhail Naganov Return<Result> removeEffect(uint64_t effectId) override; 7710548295023bee99108e418499aff09fe578211eMikhail Naganov Return<Result> standby() override; 7810548295023bee99108e418499aff09fe578211eMikhail Naganov Return<AudioDevice> getDevice() override; 7910548295023bee99108e418499aff09fe578211eMikhail Naganov Return<Result> setDevice(const DeviceAddress& address) override; 8010548295023bee99108e418499aff09fe578211eMikhail Naganov Return<Result> setConnectedState(const DeviceAddress& address, bool connected) override; 8110548295023bee99108e418499aff09fe578211eMikhail Naganov Return<Result> setHwAvSync(uint32_t hwAvSync) override; 8210548295023bee99108e418499aff09fe578211eMikhail Naganov Return<void> getParameters( 8310548295023bee99108e418499aff09fe578211eMikhail Naganov const hidl_vec<hidl_string>& keys, getParameters_cb _hidl_cb) override; 8410548295023bee99108e418499aff09fe578211eMikhail Naganov Return<Result> setParameters(const hidl_vec<ParameterValue>& parameters) override; 8570b9a15df00a42b319279d903bf5923564920e3bMartijn Coenen Return<void> debugDump(const hidl_handle& fd) override; 86b29438ef70549a331d11c0384c53cf1dc6e7f0beMikhail Naganov Return<Result> close() override; 8710548295023bee99108e418499aff09fe578211eMikhail Naganov 8810548295023bee99108e418499aff09fe578211eMikhail Naganov // Methods from ::android::hardware::audio::V2_0::IStreamIn follow. 8910548295023bee99108e418499aff09fe578211eMikhail Naganov Return<void> getAudioSource(getAudioSource_cb _hidl_cb) override; 9010548295023bee99108e418499aff09fe578211eMikhail Naganov Return<Result> setGain(float gain) override; 91b29438ef70549a331d11c0384c53cf1dc6e7f0beMikhail Naganov Return<void> prepareForReading( 92a1db22a3e5b45b3bd3c2edf84c605ce211c89220Mikhail Naganov uint32_t frameSize, uint32_t framesCount, prepareForReading_cb _hidl_cb) override; 9310548295023bee99108e418499aff09fe578211eMikhail Naganov Return<uint32_t> getInputFramesLost() override; 9410548295023bee99108e418499aff09fe578211eMikhail Naganov Return<void> getCapturePosition(getCapturePosition_cb _hidl_cb) override; 957deb7dad39e58b6e5de812075950adc27cd51d95Eric Laurent Return<Result> start() override; 967deb7dad39e58b6e5de812075950adc27cd51d95Eric Laurent Return<Result> stop() override; 977deb7dad39e58b6e5de812075950adc27cd51d95Eric Laurent Return<void> createMmapBuffer(int32_t minSizeFrames, createMmapBuffer_cb _hidl_cb) override; 987deb7dad39e58b6e5de812075950adc27cd51d95Eric Laurent Return<void> getMmapPosition(getMmapPosition_cb _hidl_cb) override; 9910548295023bee99108e418499aff09fe578211eMikhail Naganov 100a468fa84d13b085b1808f20f70d22ed9dbe3f3ebMikhail Naganov static Result getCapturePositionImpl( 101a468fa84d13b085b1808f20f70d22ed9dbe3f3ebMikhail Naganov audio_stream_in_t *stream, uint64_t *frames, uint64_t *time); 102a468fa84d13b085b1808f20f70d22ed9dbe3f3ebMikhail Naganov 10310548295023bee99108e418499aff09fe578211eMikhail Naganov private: 104b29438ef70549a331d11c0384c53cf1dc6e7f0beMikhail Naganov bool mIsClosed; 105936279e1ffe6bf7e842c46f9a94d98a48dce6754Mikhail Naganov const sp<Device> mDevice; 10610548295023bee99108e418499aff09fe578211eMikhail Naganov audio_stream_in_t *mStream; 107936279e1ffe6bf7e842c46f9a94d98a48dce6754Mikhail Naganov const sp<Stream> mStreamCommon; 108936279e1ffe6bf7e842c46f9a94d98a48dce6754Mikhail Naganov const sp<StreamMmap<audio_stream_in_t>> mStreamMmap; 109a468fa84d13b085b1808f20f70d22ed9dbe3f3ebMikhail Naganov std::unique_ptr<CommandMQ> mCommandMQ; 110b29438ef70549a331d11c0384c53cf1dc6e7f0beMikhail Naganov std::unique_ptr<DataMQ> mDataMQ; 111b29438ef70549a331d11c0384c53cf1dc6e7f0beMikhail Naganov std::unique_ptr<StatusMQ> mStatusMQ; 112b29438ef70549a331d11c0384c53cf1dc6e7f0beMikhail Naganov EventFlag* mEfGroup; 113b29438ef70549a331d11c0384c53cf1dc6e7f0beMikhail Naganov std::atomic<bool> mStopReadThread; 114b29438ef70549a331d11c0384c53cf1dc6e7f0beMikhail Naganov sp<Thread> mReadThread; 11510548295023bee99108e418499aff09fe578211eMikhail Naganov 11610548295023bee99108e418499aff09fe578211eMikhail Naganov virtual ~StreamIn(); 11710548295023bee99108e418499aff09fe578211eMikhail Naganov}; 11810548295023bee99108e418499aff09fe578211eMikhail Naganov 11910548295023bee99108e418499aff09fe578211eMikhail Naganov} // namespace implementation 12010548295023bee99108e418499aff09fe578211eMikhail Naganov} // namespace V2_0 12110548295023bee99108e418499aff09fe578211eMikhail Naganov} // namespace audio 12210548295023bee99108e418499aff09fe578211eMikhail Naganov} // namespace hardware 12310548295023bee99108e418499aff09fe578211eMikhail Naganov} // namespace android 12410548295023bee99108e418499aff09fe578211eMikhail Naganov 125d6e4f03acf5fa1e76b75e33af7a26f248a92be9aSteven Moreland#endif // ANDROID_HARDWARE_AUDIO_V2_0_STREAMIN_H 126