1// Copyright 2017 The Fuchsia Authors. All rights reserved. 2// Use of this source code is governed by a BSD-style license that can be 3// found in the LICENSE file. 4 5#pragma once 6 7#include <audio-utils/audio-stream.h> 8#include <zircon/types.h> 9 10class SineSource : public audio::utils::AudioSource { 11public: 12 SineSource() { } 13 14 zx_status_t Init(float freq, 15 float amp, 16 float duration_secs, 17 uint32_t frame_rate, 18 uint32_t channels, 19 audio_sample_format_t sample_format); 20 21 zx_status_t GetFormat(Format* out_format) final; 22 zx_status_t GetFrames(void* buffer, uint32_t buf_space, uint32_t* out_packed); 23 bool finished() const final { return (frames_produced_ >= frames_to_produce_); } 24 25private: 26 using GetFramesThunk = zx_status_t (SineSource::*)(void* buffer, 27 uint32_t buf_space, 28 uint32_t* out_packed); 29 30 template <audio_sample_format_t SAMPLE_FORMAT> 31 zx_status_t InitInternal(); 32 33 template <audio_sample_format_t SAMPLE_FORMAT> 34 zx_status_t GetFramesInternal(void* buffer, uint32_t buf_space, uint32_t* out_packed); 35 36 uint64_t frames_to_produce_; 37 uint64_t frames_produced_; 38 double amp_; 39 double sine_scalar_; 40 uint32_t frame_rate_; 41 uint32_t channels_; 42 uint32_t frame_size_; 43 audio_sample_format_t sample_format_; 44 GetFramesThunk get_frames_thunk_ = nullptr; 45}; 46