forked from Bananymous/banan-os
				
			
		
			
				
	
	
		
			72 lines
		
	
	
		
			1.5 KiB
		
	
	
	
		
			C++
		
	
	
	
			
		
		
	
	
			72 lines
		
	
	
		
			1.5 KiB
		
	
	
	
		
			C++
		
	
	
	
| #pragma once
 | |
| 
 | |
| #include <BAN/Atomic.h>
 | |
| #include <BAN/StringView.h>
 | |
| #include <BAN/Vector.h>
 | |
| 
 | |
| #include <LibAudio/AudioLoader.h>
 | |
| 
 | |
| namespace LibAudio
 | |
| {
 | |
| 
 | |
| 	static constexpr BAN::StringView s_audio_server_socket = "/tmp/audio-server.socket"_sv;
 | |
| 
 | |
| 	struct AudioBuffer
 | |
| 	{
 | |
| 		using sample_t = double;
 | |
| 
 | |
| 		uint32_t sample_rate;
 | |
| 		uint32_t channels;
 | |
| 
 | |
| 		BAN::Atomic<bool> paused { false };
 | |
| 
 | |
| 		uint32_t capacity;
 | |
| 		BAN::Atomic<uint32_t> tail { 0 };
 | |
| 		BAN::Atomic<uint32_t> head { 0 };
 | |
| 		sample_t samples[/* capacity */];
 | |
| 	};
 | |
| 
 | |
| 	class Audio
 | |
| 	{
 | |
| 		BAN_NON_COPYABLE(Audio);
 | |
| 
 | |
| 	public:
 | |
| 		static BAN::ErrorOr<Audio> create(uint32_t channels, uint32_t sample_rate, uint32_t sample_frames);
 | |
| 		static BAN::ErrorOr<Audio> load(BAN::StringView path);
 | |
| 		static BAN::ErrorOr<Audio> random(uint32_t samples);
 | |
| 		~Audio() { clear(); }
 | |
| 
 | |
| 		Audio(Audio&& other) { *this = BAN::move(other); }
 | |
| 		Audio& operator=(Audio&& other);
 | |
| 
 | |
| 		BAN::ErrorOr<void> start();
 | |
| 		void update();
 | |
| 
 | |
| 		void set_paused(bool paused);
 | |
| 
 | |
| 		bool is_playing() const { return m_audio_buffer->tail != m_audio_buffer->head; }
 | |
| 
 | |
| 		size_t queue_samples(BAN::Span<const AudioBuffer::sample_t> samples);
 | |
| 
 | |
| 	private:
 | |
| 		Audio() = default;
 | |
| 		Audio(BAN::UniqPtr<AudioLoader>&& audio_loader)
 | |
| 			: m_audio_loader(BAN::move(audio_loader))
 | |
| 		{ }
 | |
| 
 | |
| 		void clear();
 | |
| 
 | |
| 		BAN::ErrorOr<void> initialize(uint32_t total_samples);
 | |
| 
 | |
| 	private:
 | |
| 		int m_server_fd { -1 };
 | |
| 
 | |
| 		BAN::UniqPtr<AudioLoader> m_audio_loader;
 | |
| 
 | |
| 		long m_smo_key { -1 };
 | |
| 		size_t m_smo_size { 0 };
 | |
| 		AudioBuffer* m_audio_buffer { nullptr };
 | |
| 	};
 | |
| 
 | |
| }
 |