blob: 3cf48a991e1d68c7d7abf71390f4357d15953d94 [file] [log] [blame]
// Copyright 2017 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.
#pragma once
#include <zircon/device/audio.h>
#include <zircon/types.h>
#include <zx/channel.h>
#include <zx/vmo.h>
#include <fbl/unique_ptr.h>
#include <fbl/vector.h>
namespace audio {
namespace utils {
class AudioDeviceStream {
public:
zx_status_t Open();
zx_status_t GetSupportedFormats(fbl::Vector<audio_stream_format_range_t>* out_formats) const;
zx_status_t SetMute(bool mute);
zx_status_t SetGain(float gain);
zx_status_t GetGain(audio_stream_cmd_get_gain_resp_t* out_gain) const;
zx_status_t PlugMonitor(float duration);
zx_status_t SetFormat(uint32_t frames_per_second,
uint16_t channels,
audio_sample_format_t sample_format);
zx_status_t GetBuffer(uint32_t frames, uint32_t irqs_per_ring);
zx_status_t StartRingBuffer();
zx_status_t StopRingBuffer();
void ResetRingBuffer();
zx_status_t GetPlugState(audio_stream_cmd_plug_detect_resp_t* out_state) const {
return GetPlugState(out_state, false);
}
bool IsStreamBufChannelConnected() const { return IsChannelConnected(stream_ch_); }
bool IsRingBufChannelConnected() const { return IsChannelConnected(rb_ch_); }
const char* name() const { return name_; }
bool input() const { return input_; }
uint32_t frame_rate() const { return frame_rate_; }
uint32_t sample_size() const { return sample_size_; }
uint32_t channel_cnt() const { return channel_cnt_; }
uint32_t frame_sz() const { return frame_sz_; }
uint64_t fifo_depth() const { return fifo_depth_; }
uint64_t start_ticks() const { return start_ticks_; }
uint32_t ring_buffer_bytes() const { return rb_sz_; }
void* ring_buffer() const { return rb_virt_; }
protected:
friend class fbl::unique_ptr<AudioDeviceStream>;
static bool IsChannelConnected(const zx::channel& ch);
zx_status_t GetPlugState(audio_stream_cmd_plug_detect_resp_t* out_state,
bool enable_notify) const;
void DisablePlugNotifications();
AudioDeviceStream(bool input, uint32_t dev_id);
AudioDeviceStream(bool input, const char* dev_path);
virtual ~AudioDeviceStream() { }
zx::channel stream_ch_;
zx::channel rb_ch_;
zx::vmo rb_vmo_;
const bool input_;
char name_[64] = { 0 };
audio_sample_format_t sample_format_;
uint32_t frame_rate_ = 0;
uint32_t sample_size_ = 0;
uint32_t channel_cnt_ = 0;
uint32_t frame_sz_ = 0;
uint32_t fifo_depth_ = 0;
uint64_t start_ticks_ = 0;
uint32_t rb_sz_ = 0;
void* rb_virt_ = nullptr;
};
} // namespace utils
} // namespace audio