blob: 42536d59b11cea7770b14953ee553d3877dd050c [file] [log] [blame] [edit]
//
// 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.
#include "host/libs/audio_connector/commands.h"
#include <android-base/logging.h>
#include "host/libs/audio_connector/shm_layout.h"
namespace cuttlefish {
AudioCommand::~AudioCommand() {
CHECK(status_ != AudioStatus::NOT_SET)
<< "A command of type " << static_cast<uint32_t>(type())
<< " went out of scope without reply";
}
StreamInfoCommand::StreamInfoCommand(uint32_t start_id, size_t count,
virtio_snd_pcm_info* pcm_info)
: InfoCommand(AudioCommandType::VIRTIO_SND_R_PCM_INFO, start_id, count,
pcm_info) {}
void StreamInfoCommand::Reply(AudioStatus status,
const std::vector<virtio_snd_pcm_info>& reply) {
MarkReplied(status);
if (status != AudioStatus::VIRTIO_SND_S_OK) {
return;
}
CHECK(reply.size() == count())
<< "Returned unmatching info count: " << reply.size() << " vs "
<< count();
for (int i = 0; i < reply.size(); ++i) {
info_reply()[i].hdr.hda_fn_nid = Le32(reply[i].hdr.hda_fn_nid);
info_reply()[i].features = Le32(reply[i].features);
info_reply()[i].formats = Le64(reply[i].formats);
info_reply()[i].rates = Le64(reply[i].rates);
info_reply()[i].direction = reply[i].direction;
info_reply()[i].channels_min = reply[i].channels_min;
info_reply()[i].channels_max = reply[i].channels_max;
// pcm_info[i].padding is supposed to be all zeros in virtio-snd but here we
// can just ignore it.
}
}
StreamControlCommand::StreamControlCommand(AudioCommandType type,
uint32_t stream_id)
: AudioCommand(type), stream_id_(stream_id) {}
void StreamControlCommand::Reply(AudioStatus status) {
// These commands don't expect a reply, this method just forces
// acknowledgement of the command.
MarkReplied(status);
}
StreamSetParamsCommand::StreamSetParamsCommand(
uint32_t stream_id, uint32_t buffer_bytes, uint32_t period_bytes,
uint32_t features, uint8_t channels, uint8_t format, uint8_t rate)
: StreamControlCommand(AudioCommandType::VIRTIO_SND_R_PCM_SET_PARAMS,
stream_id),
buffer_bytes_(buffer_bytes),
period_bytes_(period_bytes),
features_(features),
channels_(channels),
format_(format),
rate_(rate) {}
} // namespace cuttlefish