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 1710548295023bee99108e418499aff09fe578211eMikhail Naganov#include <inttypes.h> 1810548295023bee99108e418499aff09fe578211eMikhail Naganov 1910548295023bee99108e418499aff09fe578211eMikhail Naganov#define LOG_TAG "StreamHAL" 2010548295023bee99108e418499aff09fe578211eMikhail Naganov 2110548295023bee99108e418499aff09fe578211eMikhail Naganov#include <hardware/audio.h> 2210548295023bee99108e418499aff09fe578211eMikhail Naganov#include <hardware/audio_effect.h> 2310548295023bee99108e418499aff09fe578211eMikhail Naganov#include <media/TypeConverter.h> 24f9d303435d80161fabb16cdff3b8f2f75f362480Yifan Hong#include <android/log.h> 2510548295023bee99108e418499aff09fe578211eMikhail Naganov#include <utils/SortedVector.h> 2610548295023bee99108e418499aff09fe578211eMikhail Naganov#include <utils/Vector.h> 2710548295023bee99108e418499aff09fe578211eMikhail Naganov 2810548295023bee99108e418499aff09fe578211eMikhail Naganov#include "Conversions.h" 2910548295023bee99108e418499aff09fe578211eMikhail Naganov#include "EffectMap.h" 3010548295023bee99108e418499aff09fe578211eMikhail Naganov#include "Stream.h" 3110548295023bee99108e418499aff09fe578211eMikhail Naganov 3210548295023bee99108e418499aff09fe578211eMikhail Naganovnamespace android { 3310548295023bee99108e418499aff09fe578211eMikhail Naganovnamespace hardware { 3410548295023bee99108e418499aff09fe578211eMikhail Naganovnamespace audio { 3510548295023bee99108e418499aff09fe578211eMikhail Naganovnamespace V2_0 { 3610548295023bee99108e418499aff09fe578211eMikhail Naganovnamespace implementation { 3710548295023bee99108e418499aff09fe578211eMikhail Naganov 3810548295023bee99108e418499aff09fe578211eMikhail NaganovStream::Stream(audio_stream_t* stream) 3910548295023bee99108e418499aff09fe578211eMikhail Naganov : mStream(stream) { 4010548295023bee99108e418499aff09fe578211eMikhail Naganov} 4110548295023bee99108e418499aff09fe578211eMikhail Naganov 4210548295023bee99108e418499aff09fe578211eMikhail NaganovStream::~Stream() { 4310548295023bee99108e418499aff09fe578211eMikhail Naganov mStream = nullptr; 4410548295023bee99108e418499aff09fe578211eMikhail Naganov} 4510548295023bee99108e418499aff09fe578211eMikhail Naganov 467deb7dad39e58b6e5de812075950adc27cd51d95Eric Laurent// static 47f74df70fd777cc2fa426e992c64c1f4aa78a9122Mikhail NaganovResult Stream::analyzeStatus(const char* funcName, int status) { 48f74df70fd777cc2fa426e992c64c1f4aa78a9122Mikhail Naganov static const std::vector<int> empty; 49f74df70fd777cc2fa426e992c64c1f4aa78a9122Mikhail Naganov return analyzeStatus(funcName, status, empty); 50f74df70fd777cc2fa426e992c64c1f4aa78a9122Mikhail Naganov} 51f74df70fd777cc2fa426e992c64c1f4aa78a9122Mikhail Naganov 52f74df70fd777cc2fa426e992c64c1f4aa78a9122Mikhail Naganovtemplate <typename T> 53f74df70fd777cc2fa426e992c64c1f4aa78a9122Mikhail Naganovinline bool element_in(T e, const std::vector<T>& v) { 54f74df70fd777cc2fa426e992c64c1f4aa78a9122Mikhail Naganov return std::find(v.begin(), v.end(), e) != v.end(); 55f74df70fd777cc2fa426e992c64c1f4aa78a9122Mikhail Naganov} 56f74df70fd777cc2fa426e992c64c1f4aa78a9122Mikhail Naganov 57f74df70fd777cc2fa426e992c64c1f4aa78a9122Mikhail Naganov// static 58f74df70fd777cc2fa426e992c64c1f4aa78a9122Mikhail NaganovResult Stream::analyzeStatus(const char* funcName, int status, 59f74df70fd777cc2fa426e992c64c1f4aa78a9122Mikhail Naganov const std::vector<int>& ignoreErrors) { 60f74df70fd777cc2fa426e992c64c1f4aa78a9122Mikhail Naganov if (status != 0 && (ignoreErrors.empty() || !element_in(-status, ignoreErrors))) { 617deb7dad39e58b6e5de812075950adc27cd51d95Eric Laurent ALOGW("Error from HAL stream in function %s: %s", funcName, strerror(-status)); 6210548295023bee99108e418499aff09fe578211eMikhail Naganov } 6310548295023bee99108e418499aff09fe578211eMikhail Naganov switch (status) { 6410548295023bee99108e418499aff09fe578211eMikhail Naganov case 0: return Result::OK; 6510548295023bee99108e418499aff09fe578211eMikhail Naganov case -EINVAL: return Result::INVALID_ARGUMENTS; 6610548295023bee99108e418499aff09fe578211eMikhail Naganov case -ENODATA: return Result::INVALID_STATE; 6710548295023bee99108e418499aff09fe578211eMikhail Naganov case -ENODEV: return Result::NOT_INITIALIZED; 6810548295023bee99108e418499aff09fe578211eMikhail Naganov case -ENOSYS: return Result::NOT_SUPPORTED; 6910548295023bee99108e418499aff09fe578211eMikhail Naganov default: return Result::INVALID_STATE; 7010548295023bee99108e418499aff09fe578211eMikhail Naganov } 7110548295023bee99108e418499aff09fe578211eMikhail Naganov} 7210548295023bee99108e418499aff09fe578211eMikhail Naganov 7310548295023bee99108e418499aff09fe578211eMikhail Naganovchar* Stream::halGetParameters(const char* keys) { 7410548295023bee99108e418499aff09fe578211eMikhail Naganov return mStream->get_parameters(mStream, keys); 7510548295023bee99108e418499aff09fe578211eMikhail Naganov} 7610548295023bee99108e418499aff09fe578211eMikhail Naganov 7710548295023bee99108e418499aff09fe578211eMikhail Naganovint Stream::halSetParameters(const char* keysAndValues) { 7810548295023bee99108e418499aff09fe578211eMikhail Naganov return mStream->set_parameters(mStream, keysAndValues); 7910548295023bee99108e418499aff09fe578211eMikhail Naganov} 8010548295023bee99108e418499aff09fe578211eMikhail Naganov 8110548295023bee99108e418499aff09fe578211eMikhail Naganov// Methods from ::android::hardware::audio::V2_0::IStream follow. 8210548295023bee99108e418499aff09fe578211eMikhail NaganovReturn<uint64_t> Stream::getFrameSize() { 8310548295023bee99108e418499aff09fe578211eMikhail Naganov // Needs to be implemented by interface subclasses. But can't be declared as pure virtual, 8410548295023bee99108e418499aff09fe578211eMikhail Naganov // since interface subclasses implementation do not inherit from this class. 8510548295023bee99108e418499aff09fe578211eMikhail Naganov LOG_ALWAYS_FATAL("Stream::getFrameSize is pure abstract"); 8610548295023bee99108e418499aff09fe578211eMikhail Naganov return uint64_t {}; 8710548295023bee99108e418499aff09fe578211eMikhail Naganov} 8810548295023bee99108e418499aff09fe578211eMikhail Naganov 8910548295023bee99108e418499aff09fe578211eMikhail NaganovReturn<uint64_t> Stream::getFrameCount() { 9010548295023bee99108e418499aff09fe578211eMikhail Naganov int halFrameCount; 9110548295023bee99108e418499aff09fe578211eMikhail Naganov Result retval = getParam(AudioParameter::keyFrameCount, &halFrameCount); 9210548295023bee99108e418499aff09fe578211eMikhail Naganov return retval == Result::OK ? halFrameCount : 0; 9310548295023bee99108e418499aff09fe578211eMikhail Naganov} 9410548295023bee99108e418499aff09fe578211eMikhail Naganov 9510548295023bee99108e418499aff09fe578211eMikhail NaganovReturn<uint64_t> Stream::getBufferSize() { 9610548295023bee99108e418499aff09fe578211eMikhail Naganov return mStream->get_buffer_size(mStream); 9710548295023bee99108e418499aff09fe578211eMikhail Naganov} 9810548295023bee99108e418499aff09fe578211eMikhail Naganov 9910548295023bee99108e418499aff09fe578211eMikhail NaganovReturn<uint32_t> Stream::getSampleRate() { 10010548295023bee99108e418499aff09fe578211eMikhail Naganov return mStream->get_sample_rate(mStream); 10110548295023bee99108e418499aff09fe578211eMikhail Naganov} 10210548295023bee99108e418499aff09fe578211eMikhail Naganov 10310548295023bee99108e418499aff09fe578211eMikhail NaganovReturn<void> Stream::getSupportedSampleRates(getSupportedSampleRates_cb _hidl_cb) { 10410548295023bee99108e418499aff09fe578211eMikhail Naganov String8 halListValue; 10510548295023bee99108e418499aff09fe578211eMikhail Naganov Result result = getParam(AudioParameter::keyStreamSupportedSamplingRates, &halListValue); 10610548295023bee99108e418499aff09fe578211eMikhail Naganov hidl_vec<uint32_t> sampleRates; 10710548295023bee99108e418499aff09fe578211eMikhail Naganov SortedVector<uint32_t> halSampleRates; 10810548295023bee99108e418499aff09fe578211eMikhail Naganov if (result == Result::OK) { 10910548295023bee99108e418499aff09fe578211eMikhail Naganov halSampleRates = samplingRatesFromString( 11010548295023bee99108e418499aff09fe578211eMikhail Naganov halListValue.string(), AudioParameter::valueListSeparator); 11110548295023bee99108e418499aff09fe578211eMikhail Naganov sampleRates.setToExternal(halSampleRates.editArray(), halSampleRates.size()); 11210548295023bee99108e418499aff09fe578211eMikhail Naganov } 11310548295023bee99108e418499aff09fe578211eMikhail Naganov _hidl_cb(sampleRates); 11410548295023bee99108e418499aff09fe578211eMikhail Naganov return Void(); 11510548295023bee99108e418499aff09fe578211eMikhail Naganov} 11610548295023bee99108e418499aff09fe578211eMikhail Naganov 11710548295023bee99108e418499aff09fe578211eMikhail NaganovReturn<Result> Stream::setSampleRate(uint32_t sampleRateHz) { 11810548295023bee99108e418499aff09fe578211eMikhail Naganov return setParam(AudioParameter::keySamplingRate, static_cast<int>(sampleRateHz)); 11910548295023bee99108e418499aff09fe578211eMikhail Naganov} 12010548295023bee99108e418499aff09fe578211eMikhail Naganov 12110548295023bee99108e418499aff09fe578211eMikhail NaganovReturn<AudioChannelMask> Stream::getChannelMask() { 12210548295023bee99108e418499aff09fe578211eMikhail Naganov return AudioChannelMask(mStream->get_channels(mStream)); 12310548295023bee99108e418499aff09fe578211eMikhail Naganov} 12410548295023bee99108e418499aff09fe578211eMikhail Naganov 12510548295023bee99108e418499aff09fe578211eMikhail NaganovReturn<void> Stream::getSupportedChannelMasks(getSupportedChannelMasks_cb _hidl_cb) { 12610548295023bee99108e418499aff09fe578211eMikhail Naganov String8 halListValue; 12710548295023bee99108e418499aff09fe578211eMikhail Naganov Result result = getParam(AudioParameter::keyStreamSupportedChannels, &halListValue); 12810548295023bee99108e418499aff09fe578211eMikhail Naganov hidl_vec<AudioChannelMask> channelMasks; 12910548295023bee99108e418499aff09fe578211eMikhail Naganov SortedVector<audio_channel_mask_t> halChannelMasks; 13010548295023bee99108e418499aff09fe578211eMikhail Naganov if (result == Result::OK) { 13110548295023bee99108e418499aff09fe578211eMikhail Naganov halChannelMasks = channelMasksFromString( 13210548295023bee99108e418499aff09fe578211eMikhail Naganov halListValue.string(), AudioParameter::valueListSeparator); 13310548295023bee99108e418499aff09fe578211eMikhail Naganov channelMasks.resize(halChannelMasks.size()); 13410548295023bee99108e418499aff09fe578211eMikhail Naganov for (size_t i = 0; i < halChannelMasks.size(); ++i) { 13510548295023bee99108e418499aff09fe578211eMikhail Naganov channelMasks[i] = AudioChannelMask(halChannelMasks[i]); 13610548295023bee99108e418499aff09fe578211eMikhail Naganov } 13710548295023bee99108e418499aff09fe578211eMikhail Naganov } 13810548295023bee99108e418499aff09fe578211eMikhail Naganov _hidl_cb(channelMasks); 13910548295023bee99108e418499aff09fe578211eMikhail Naganov return Void(); 14010548295023bee99108e418499aff09fe578211eMikhail Naganov} 14110548295023bee99108e418499aff09fe578211eMikhail Naganov 14210548295023bee99108e418499aff09fe578211eMikhail NaganovReturn<Result> Stream::setChannelMask(AudioChannelMask mask) { 14310548295023bee99108e418499aff09fe578211eMikhail Naganov return setParam(AudioParameter::keyChannels, static_cast<int>(mask)); 14410548295023bee99108e418499aff09fe578211eMikhail Naganov} 14510548295023bee99108e418499aff09fe578211eMikhail Naganov 14610548295023bee99108e418499aff09fe578211eMikhail NaganovReturn<AudioFormat> Stream::getFormat() { 14710548295023bee99108e418499aff09fe578211eMikhail Naganov return AudioFormat(mStream->get_format(mStream)); 14810548295023bee99108e418499aff09fe578211eMikhail Naganov} 14910548295023bee99108e418499aff09fe578211eMikhail Naganov 15010548295023bee99108e418499aff09fe578211eMikhail NaganovReturn<void> Stream::getSupportedFormats(getSupportedFormats_cb _hidl_cb) { 15110548295023bee99108e418499aff09fe578211eMikhail Naganov String8 halListValue; 15210548295023bee99108e418499aff09fe578211eMikhail Naganov Result result = getParam(AudioParameter::keyStreamSupportedFormats, &halListValue); 15310548295023bee99108e418499aff09fe578211eMikhail Naganov hidl_vec<AudioFormat> formats; 15410548295023bee99108e418499aff09fe578211eMikhail Naganov Vector<audio_format_t> halFormats; 15510548295023bee99108e418499aff09fe578211eMikhail Naganov if (result == Result::OK) { 15610548295023bee99108e418499aff09fe578211eMikhail Naganov halFormats = formatsFromString(halListValue.string(), AudioParameter::valueListSeparator); 15710548295023bee99108e418499aff09fe578211eMikhail Naganov formats.resize(halFormats.size()); 15810548295023bee99108e418499aff09fe578211eMikhail Naganov for (size_t i = 0; i < halFormats.size(); ++i) { 15910548295023bee99108e418499aff09fe578211eMikhail Naganov formats[i] = AudioFormat(halFormats[i]); 16010548295023bee99108e418499aff09fe578211eMikhail Naganov } 16110548295023bee99108e418499aff09fe578211eMikhail Naganov } 16210548295023bee99108e418499aff09fe578211eMikhail Naganov _hidl_cb(formats); 16310548295023bee99108e418499aff09fe578211eMikhail Naganov return Void(); 16410548295023bee99108e418499aff09fe578211eMikhail Naganov} 16510548295023bee99108e418499aff09fe578211eMikhail Naganov 16610548295023bee99108e418499aff09fe578211eMikhail NaganovReturn<Result> Stream::setFormat(AudioFormat format) { 16710548295023bee99108e418499aff09fe578211eMikhail Naganov return setParam(AudioParameter::keyFormat, static_cast<int>(format)); 16810548295023bee99108e418499aff09fe578211eMikhail Naganov} 16910548295023bee99108e418499aff09fe578211eMikhail Naganov 17010548295023bee99108e418499aff09fe578211eMikhail NaganovReturn<void> Stream::getAudioProperties(getAudioProperties_cb _hidl_cb) { 17110548295023bee99108e418499aff09fe578211eMikhail Naganov uint32_t halSampleRate = mStream->get_sample_rate(mStream); 17210548295023bee99108e418499aff09fe578211eMikhail Naganov audio_channel_mask_t halMask = mStream->get_channels(mStream); 17310548295023bee99108e418499aff09fe578211eMikhail Naganov audio_format_t halFormat = mStream->get_format(mStream); 17410548295023bee99108e418499aff09fe578211eMikhail Naganov _hidl_cb(halSampleRate, AudioChannelMask(halMask), AudioFormat(halFormat)); 17510548295023bee99108e418499aff09fe578211eMikhail Naganov return Void(); 17610548295023bee99108e418499aff09fe578211eMikhail Naganov} 17710548295023bee99108e418499aff09fe578211eMikhail Naganov 17810548295023bee99108e418499aff09fe578211eMikhail NaganovReturn<Result> Stream::addEffect(uint64_t effectId) { 17910548295023bee99108e418499aff09fe578211eMikhail Naganov effect_handle_t halEffect = EffectMap::getInstance().get(effectId); 18010548295023bee99108e418499aff09fe578211eMikhail Naganov if (halEffect != NULL) { 18110548295023bee99108e418499aff09fe578211eMikhail Naganov return analyzeStatus("add_audio_effect", mStream->add_audio_effect(mStream, halEffect)); 18210548295023bee99108e418499aff09fe578211eMikhail Naganov } else { 18310548295023bee99108e418499aff09fe578211eMikhail Naganov ALOGW("Invalid effect ID passed from client: %" PRIu64, effectId); 18410548295023bee99108e418499aff09fe578211eMikhail Naganov return Result::INVALID_ARGUMENTS; 18510548295023bee99108e418499aff09fe578211eMikhail Naganov } 18610548295023bee99108e418499aff09fe578211eMikhail Naganov} 18710548295023bee99108e418499aff09fe578211eMikhail Naganov 18810548295023bee99108e418499aff09fe578211eMikhail NaganovReturn<Result> Stream::removeEffect(uint64_t effectId) { 18910548295023bee99108e418499aff09fe578211eMikhail Naganov effect_handle_t halEffect = EffectMap::getInstance().get(effectId); 19010548295023bee99108e418499aff09fe578211eMikhail Naganov if (halEffect != NULL) { 19110548295023bee99108e418499aff09fe578211eMikhail Naganov return analyzeStatus( 19210548295023bee99108e418499aff09fe578211eMikhail Naganov "remove_audio_effect", mStream->remove_audio_effect(mStream, halEffect)); 19310548295023bee99108e418499aff09fe578211eMikhail Naganov } else { 19410548295023bee99108e418499aff09fe578211eMikhail Naganov ALOGW("Invalid effect ID passed from client: %" PRIu64, effectId); 19510548295023bee99108e418499aff09fe578211eMikhail Naganov return Result::INVALID_ARGUMENTS; 19610548295023bee99108e418499aff09fe578211eMikhail Naganov } 19710548295023bee99108e418499aff09fe578211eMikhail Naganov} 19810548295023bee99108e418499aff09fe578211eMikhail Naganov 19910548295023bee99108e418499aff09fe578211eMikhail NaganovReturn<Result> Stream::standby() { 20010548295023bee99108e418499aff09fe578211eMikhail Naganov return analyzeStatus("standby", mStream->standby(mStream)); 20110548295023bee99108e418499aff09fe578211eMikhail Naganov} 20210548295023bee99108e418499aff09fe578211eMikhail Naganov 20310548295023bee99108e418499aff09fe578211eMikhail NaganovReturn<AudioDevice> Stream::getDevice() { 204fd067c3f54669b84b267047d173d15392d178dc4Kevin Rocard int device; 205fd067c3f54669b84b267047d173d15392d178dc4Kevin Rocard Result retval = getParam(AudioParameter::keyRouting, &device); 206fd067c3f54669b84b267047d173d15392d178dc4Kevin Rocard return retval == Result::OK ? static_cast<AudioDevice>(device) : AudioDevice::NONE; 20710548295023bee99108e418499aff09fe578211eMikhail Naganov} 20810548295023bee99108e418499aff09fe578211eMikhail Naganov 20910548295023bee99108e418499aff09fe578211eMikhail NaganovReturn<Result> Stream::setDevice(const DeviceAddress& address) { 21010548295023bee99108e418499aff09fe578211eMikhail Naganov char* halDeviceAddress = 21110548295023bee99108e418499aff09fe578211eMikhail Naganov audio_device_address_to_parameter( 21210548295023bee99108e418499aff09fe578211eMikhail Naganov static_cast<audio_devices_t>(address.device), 21310548295023bee99108e418499aff09fe578211eMikhail Naganov deviceAddressToHal(address).c_str()); 21410548295023bee99108e418499aff09fe578211eMikhail Naganov AudioParameter params((String8(halDeviceAddress))); 21510548295023bee99108e418499aff09fe578211eMikhail Naganov free(halDeviceAddress); 21610548295023bee99108e418499aff09fe578211eMikhail Naganov params.addInt( 21710548295023bee99108e418499aff09fe578211eMikhail Naganov String8(AudioParameter::keyRouting), static_cast<audio_devices_t>(address.device)); 21810548295023bee99108e418499aff09fe578211eMikhail Naganov return setParams(params); 21910548295023bee99108e418499aff09fe578211eMikhail Naganov} 22010548295023bee99108e418499aff09fe578211eMikhail Naganov 22110548295023bee99108e418499aff09fe578211eMikhail NaganovReturn<Result> Stream::setConnectedState(const DeviceAddress& address, bool connected) { 22210548295023bee99108e418499aff09fe578211eMikhail Naganov return setParam( 22310548295023bee99108e418499aff09fe578211eMikhail Naganov connected ? AudioParameter::keyStreamConnect : AudioParameter::keyStreamDisconnect, 22410548295023bee99108e418499aff09fe578211eMikhail Naganov deviceAddressToHal(address).c_str()); 22510548295023bee99108e418499aff09fe578211eMikhail Naganov} 22610548295023bee99108e418499aff09fe578211eMikhail Naganov 22710548295023bee99108e418499aff09fe578211eMikhail NaganovReturn<Result> Stream::setHwAvSync(uint32_t hwAvSync) { 22810548295023bee99108e418499aff09fe578211eMikhail Naganov return setParam(AudioParameter::keyStreamHwAvSync, static_cast<int>(hwAvSync)); 22910548295023bee99108e418499aff09fe578211eMikhail Naganov} 23010548295023bee99108e418499aff09fe578211eMikhail Naganov 23110548295023bee99108e418499aff09fe578211eMikhail NaganovReturn<void> Stream::getParameters(const hidl_vec<hidl_string>& keys, getParameters_cb _hidl_cb) { 23210548295023bee99108e418499aff09fe578211eMikhail Naganov getParametersImpl(keys, _hidl_cb); 23310548295023bee99108e418499aff09fe578211eMikhail Naganov return Void(); 23410548295023bee99108e418499aff09fe578211eMikhail Naganov} 23510548295023bee99108e418499aff09fe578211eMikhail Naganov 23610548295023bee99108e418499aff09fe578211eMikhail NaganovReturn<Result> Stream::setParameters(const hidl_vec<ParameterValue>& parameters) { 23710548295023bee99108e418499aff09fe578211eMikhail Naganov return setParametersImpl(parameters); 23810548295023bee99108e418499aff09fe578211eMikhail Naganov} 23910548295023bee99108e418499aff09fe578211eMikhail Naganov 24070b9a15df00a42b319279d903bf5923564920e3bMartijn CoenenReturn<void> Stream::debugDump(const hidl_handle& fd) { 2413e6fe754f647db202a7a455adcf1ab5d686105d3Mikhail Naganov if (fd.getNativeHandle() != nullptr && fd->numFds == 1) { 24210548295023bee99108e418499aff09fe578211eMikhail Naganov analyzeStatus("dump", mStream->dump(mStream, fd->data[0])); 24310548295023bee99108e418499aff09fe578211eMikhail Naganov } 24410548295023bee99108e418499aff09fe578211eMikhail Naganov return Void(); 24510548295023bee99108e418499aff09fe578211eMikhail Naganov} 24610548295023bee99108e418499aff09fe578211eMikhail Naganov 2477deb7dad39e58b6e5de812075950adc27cd51d95Eric LaurentReturn<Result> Stream::start() { 2487deb7dad39e58b6e5de812075950adc27cd51d95Eric Laurent return Result::NOT_SUPPORTED; 2497deb7dad39e58b6e5de812075950adc27cd51d95Eric Laurent} 2507deb7dad39e58b6e5de812075950adc27cd51d95Eric Laurent 2517deb7dad39e58b6e5de812075950adc27cd51d95Eric LaurentReturn<Result> Stream::stop() { 2527deb7dad39e58b6e5de812075950adc27cd51d95Eric Laurent return Result::NOT_SUPPORTED; 2537deb7dad39e58b6e5de812075950adc27cd51d95Eric Laurent} 2547deb7dad39e58b6e5de812075950adc27cd51d95Eric Laurent 2557deb7dad39e58b6e5de812075950adc27cd51d95Eric LaurentReturn<void> Stream::createMmapBuffer(int32_t minSizeFrames __unused, 2567deb7dad39e58b6e5de812075950adc27cd51d95Eric Laurent createMmapBuffer_cb _hidl_cb) { 2577deb7dad39e58b6e5de812075950adc27cd51d95Eric Laurent Result retval(Result::NOT_SUPPORTED); 2587deb7dad39e58b6e5de812075950adc27cd51d95Eric Laurent MmapBufferInfo info; 2597deb7dad39e58b6e5de812075950adc27cd51d95Eric Laurent _hidl_cb(retval, info); 2607deb7dad39e58b6e5de812075950adc27cd51d95Eric Laurent return Void(); 2617deb7dad39e58b6e5de812075950adc27cd51d95Eric Laurent} 2627deb7dad39e58b6e5de812075950adc27cd51d95Eric Laurent 2637deb7dad39e58b6e5de812075950adc27cd51d95Eric LaurentReturn<void> Stream::getMmapPosition(getMmapPosition_cb _hidl_cb) { 2647deb7dad39e58b6e5de812075950adc27cd51d95Eric Laurent Result retval(Result::NOT_SUPPORTED); 2657deb7dad39e58b6e5de812075950adc27cd51d95Eric Laurent MmapPosition position; 2667deb7dad39e58b6e5de812075950adc27cd51d95Eric Laurent _hidl_cb(retval, position); 2677deb7dad39e58b6e5de812075950adc27cd51d95Eric Laurent return Void(); 2687deb7dad39e58b6e5de812075950adc27cd51d95Eric Laurent} 2697deb7dad39e58b6e5de812075950adc27cd51d95Eric Laurent 270b29438ef70549a331d11c0384c53cf1dc6e7f0beMikhail NaganovReturn<Result> Stream::close() { 271b29438ef70549a331d11c0384c53cf1dc6e7f0beMikhail Naganov return Result::NOT_SUPPORTED; 272b29438ef70549a331d11c0384c53cf1dc6e7f0beMikhail Naganov} 273b29438ef70549a331d11c0384c53cf1dc6e7f0beMikhail Naganov 27410548295023bee99108e418499aff09fe578211eMikhail Naganov} // namespace implementation 27510548295023bee99108e418499aff09fe578211eMikhail Naganov} // namespace V2_0 27610548295023bee99108e418499aff09fe578211eMikhail Naganov} // namespace audio 27710548295023bee99108e418499aff09fe578211eMikhail Naganov} // namespace hardware 27810548295023bee99108e418499aff09fe578211eMikhail Naganov} // namespace android 279