You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
96 lines
2.8 KiB
96 lines
2.8 KiB
// 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.
|
|
|
|
#define LOG_TAG "audio_proxy_client"
|
|
|
|
#include "AudioProxyDevice.h"
|
|
|
|
#include <utils/Log.h>
|
|
|
|
#include "AudioProxyStreamOut.h"
|
|
#include "HidlTypeUtil.h"
|
|
|
|
#define CHECK_API(func) \
|
|
do { \
|
|
if (!stream->func) { \
|
|
ALOGD("Undefined API %s", #func); \
|
|
return false; \
|
|
} \
|
|
} while (0)
|
|
|
|
namespace audio_proxy {
|
|
namespace AUDIO_PROXY_CPP_VERSION {
|
|
namespace {
|
|
bool isValidStreamOut(const audio_proxy_stream_out_t* stream) {
|
|
CHECK_API(get_buffer_size);
|
|
CHECK_API(get_frame_count);
|
|
CHECK_API(get_supported_sample_rates);
|
|
CHECK_API(get_sample_rate);
|
|
CHECK_API(get_supported_channel_masks);
|
|
CHECK_API(get_channel_mask);
|
|
CHECK_API(get_supported_formats);
|
|
CHECK_API(get_format);
|
|
CHECK_API(get_latency);
|
|
CHECK_API(standby);
|
|
CHECK_API(pause);
|
|
CHECK_API(resume);
|
|
CHECK_API(flush);
|
|
CHECK_API(write);
|
|
CHECK_API(get_presentation_position);
|
|
CHECK_API(set_parameters);
|
|
CHECK_API(get_parameters);
|
|
|
|
return true;
|
|
}
|
|
} // namespace
|
|
|
|
AudioProxyDevice::AudioProxyDevice(audio_proxy_device_t* device)
|
|
: mDevice(device) {}
|
|
|
|
AudioProxyDevice::~AudioProxyDevice() = default;
|
|
|
|
const char* AudioProxyDevice::getAddress() {
|
|
return mDevice->get_address(mDevice);
|
|
}
|
|
|
|
Result AudioProxyDevice::openOutputStream(
|
|
hidl_bitfield<AudioOutputFlag> flags, const AudioConfig& hidlConfig,
|
|
std::unique_ptr<AudioProxyStreamOut>* streamOut,
|
|
AudioConfig* hidlConfigOut) {
|
|
audio_proxy_config_t config = toAudioProxyConfig(hidlConfig);
|
|
|
|
audio_proxy_stream_out_t* stream = nullptr;
|
|
int ret = mDevice->open_output_stream(
|
|
mDevice, static_cast<audio_proxy_output_flags_t>(flags), &config,
|
|
&stream);
|
|
|
|
if (stream) {
|
|
if (!isValidStreamOut(stream)) {
|
|
mDevice->close_output_stream(mDevice, stream);
|
|
return Result::NOT_SUPPORTED;
|
|
}
|
|
|
|
*streamOut = std::make_unique<AudioProxyStreamOut>(stream, mDevice);
|
|
}
|
|
|
|
// Pass the config out even if open_output_stream returns error, as the
|
|
// suggested config, so that audio service can re-open the stream with
|
|
// suggested config.
|
|
*hidlConfigOut = toHidlAudioConfig(config);
|
|
return toResult(ret);
|
|
}
|
|
|
|
} // namespace AUDIO_PROXY_CPP_VERSION
|
|
} // namespace audio_proxy
|