/** This file is a part of our_dick Copyright (C) 2020 rexy712 This program is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for more details. You should have received a copy of the GNU Affero General Public License along with this program. If not, see . */ #ifndef OUR_DICK_AUDIO_CHANNEL_IMPL_HPP #define OUR_DICK_AUDIO_CHANNEL_IMPL_HPP #include #include //size_t #include "util/ring_buffer.hpp" #include "audio/mixdata.hpp" namespace audio::impl{ class channel { private: util::mpmc_ring_buffer m_data; std::atomic_bool m_paused; std::atomic_bool m_active; bool m_stopped; //audio thread access only! struct alignas(64){ mixdata data = {}; size_t offset = 0; }m_playing_chunk; public: channel(); explicit channel(size_t maxsize); channel(const channel& c); channel(channel&& c); ~channel() = default; channel& operator=(const channel& c); channel& operator=(channel&& c); mixdata pop(); bool try_pop(mixdata& m); void resize_buffer(size_t newsize); void play(const mixdata& m); void pause(); void resume(); void stop(); bool is_paused()const; bool is_playing()const; bool is_stopped()const; mixdata& playing_chunk(); const mixdata& playing_chunk()const; size_t& playing_offset(); const size_t& playing_offset()const; bool is_active()const; void set_active(bool b); private: void wait_for_consumer(); }; } #endif