blob: c5c8b15d55cabe570f36b57973eb663d90fd3356 [file] [log] [blame]
// Copyright 2020 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include <lib/simple-codec/simple-codec-client.h>
#include <ddk/debug.h>
namespace audio {
namespace codec_fidl = ::fuchsia::hardware::audio::codec;
using SyncCall = ::fuchsia::hardware::audio::codec::Codec_Sync;
zx_status_t SimpleCodecClient::SetProtocol(ddk::CodecProtocolClient proto_client) {
proto_client_ = proto_client;
if (!proto_client_.is_valid()) {
return ZX_ERR_NO_RESOURCES;
}
zx::channel channel_remote, channel_local;
auto status = zx::channel::create(0, &channel_local, &channel_remote);
if (status != ZX_OK) {
return status;
}
status = proto_client_.Connect(std::move(channel_remote));
if (status != ZX_OK) {
return status;
}
codec_.Bind(std::move(channel_local));
return ZX_OK;
}
void SimpleCodecClient::SetTimeout(int64_t nsecs) { timeout_nsecs_ = nsecs; }
zx_status_t SimpleCodecClient::Reset() {
int32_t out_status = 0;
auto status = codec_->Reset(&out_status);
return (status == ZX_OK) ? out_status : status;
}
zx_status_t SimpleCodecClient::Stop() {
int32_t out_status = 0;
auto status = codec_->Stop(&out_status);
return (status == ZX_OK) ? out_status : status;
}
zx_status_t SimpleCodecClient::Start() {
int32_t out_status = 0;
auto status = codec_->Start(&out_status);
return (status == ZX_OK) ? out_status : status;
}
zx::status<Info> SimpleCodecClient::GetInfo() {
codec_fidl::Info info = {};
auto status = codec_->GetInfo(&info);
if (status != ZX_OK) {
return zx::error(status);
}
return zx::ok(std::move(info));
}
zx::status<bool> SimpleCodecClient::IsBridgeable() {
bool out_supports_bridged_mode = false;
auto status = codec_->IsBridgeable(&out_supports_bridged_mode);
if (status != ZX_OK) {
return zx::error(status);
}
return zx::ok(out_supports_bridged_mode);
}
zx_status_t SimpleCodecClient::SetBridgedMode(bool bridged) {
return codec_->SetBridgedMode(bridged);
}
zx::status<std::vector<DaiSupportedFormats>> SimpleCodecClient::GetDaiFormats() {
int32_t out_status = 0;
std::vector<DaiSupportedFormats> out_formats;
auto status = codec_->GetDaiFormats(&out_status, &out_formats);
if (status != ZX_OK) {
return zx::error(status);
}
return zx::ok(std::move(out_formats));
}
zx_status_t SimpleCodecClient::SetDaiFormat(DaiFormat format) {
int32_t out_status = 0;
auto status = codec_->SetDaiFormat(std::move(format), &out_status);
return (status == ZX_OK) ? out_status : status;
}
zx::status<GainFormat> SimpleCodecClient::GetGainFormat() {
codec_fidl::GainFormat gain_format = {};
auto status = codec_->GetGainFormat(&gain_format);
if (status != ZX_OK) {
return zx::error(status);
}
return zx::ok(std::move(gain_format));
}
zx::status<GainState> SimpleCodecClient::GetGainState() {
codec_fidl::GainState gain_state = {};
auto status = codec_->GetGainState(&gain_state);
if (status != ZX_OK) {
return zx::error(status);
}
return zx::ok(std::move(gain_state));
}
void SimpleCodecClient::SetGainState(GainState state) {
auto unused = codec_->SetGainState(std::move(state));
static_cast<void>(unused);
}
zx::status<PlugState> SimpleCodecClient::GetPlugState() {
codec_fidl::PlugState plug_state = {};
auto status = codec_->GetPlugState(&plug_state);
if (status != ZX_OK) {
return zx::error(status);
}
return zx::ok(std::move(plug_state));
}
} // namespace audio