| 
									
										
										
										
											2018-07-26 20:01:37 -04:00
										 |  |  | // Copyright 2018 yuzu Emulator Project
 | 
					
						
							|  |  |  | // Licensed under GPLv2 or any later version
 | 
					
						
							|  |  |  | // Refer to the license.txt file included.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #include "audio_core/audio_out.h"
 | 
					
						
							| 
									
										
										
										
											2018-07-28 13:44:50 -04:00
										 |  |  | #include "audio_core/sink.h"
 | 
					
						
							|  |  |  | #include "audio_core/sink_details.h"
 | 
					
						
							| 
									
										
										
										
											2018-07-26 20:01:37 -04:00
										 |  |  | #include "common/assert.h"
 | 
					
						
							|  |  |  | #include "common/logging/log.h"
 | 
					
						
							| 
									
										
										
										
											2018-07-30 23:57:53 -04:00
										 |  |  | #include "core/settings.h"
 | 
					
						
							| 
									
										
										
										
											2018-07-26 20:01:37 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  | namespace AudioCore { | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /// Returns the stream format from the specified number of channels
 | 
					
						
							| 
									
										
										
										
											2018-07-28 13:35:22 -04:00
										 |  |  | static Stream::Format ChannelsToStreamFormat(u32 num_channels) { | 
					
						
							| 
									
										
										
										
											2018-07-26 20:01:37 -04:00
										 |  |  |     switch (num_channels) { | 
					
						
							|  |  |  |     case 1: | 
					
						
							|  |  |  |         return Stream::Format::Mono16; | 
					
						
							|  |  |  |     case 2: | 
					
						
							|  |  |  |         return Stream::Format::Stereo16; | 
					
						
							|  |  |  |     case 6: | 
					
						
							|  |  |  |         return Stream::Format::Multi51Channel16; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     LOG_CRITICAL(Audio, "Unimplemented num_channels={}", num_channels); | 
					
						
							|  |  |  |     UNREACHABLE(); | 
					
						
							|  |  |  |     return {}; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-08-02 18:27:22 -04:00
										 |  |  | StreamPtr AudioOut::OpenStream(u32 sample_rate, u32 num_channels, std::string&& name, | 
					
						
							| 
									
										
										
										
											2018-07-26 20:01:37 -04:00
										 |  |  |                                Stream::ReleaseCallback&& release_callback) { | 
					
						
							| 
									
										
										
										
											2018-07-28 13:44:50 -04:00
										 |  |  |     if (!sink) { | 
					
						
							| 
									
										
										
										
											2018-07-30 23:57:53 -04:00
										 |  |  |         const SinkDetails& sink_details = GetSinkDetails(Settings::values.sink_id); | 
					
						
							|  |  |  |         sink = sink_details.factory(Settings::values.audio_device_id); | 
					
						
							| 
									
										
										
										
											2018-07-28 13:44:50 -04:00
										 |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-08-02 18:27:22 -04:00
										 |  |  |     return std::make_shared<Stream>( | 
					
						
							|  |  |  |         sample_rate, ChannelsToStreamFormat(num_channels), std::move(release_callback), | 
					
						
							|  |  |  |         sink->AcquireSinkStream(sample_rate, num_channels), std::move(name)); | 
					
						
							| 
									
										
										
										
											2018-07-26 20:01:37 -04:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-08-02 00:10:21 -04:00
										 |  |  | std::vector<Buffer::Tag> AudioOut::GetTagsAndReleaseBuffers(StreamPtr stream, size_t max_count) { | 
					
						
							| 
									
										
										
										
											2018-07-26 20:01:37 -04:00
										 |  |  |     return stream->GetTagsAndReleaseBuffers(max_count); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | void AudioOut::StartStream(StreamPtr stream) { | 
					
						
							|  |  |  |     stream->Play(); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | void AudioOut::StopStream(StreamPtr stream) { | 
					
						
							|  |  |  |     stream->Stop(); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | bool AudioOut::QueueBuffer(StreamPtr stream, Buffer::Tag tag, std::vector<u8>&& data) { | 
					
						
							|  |  |  |     return stream->QueueBuffer(std::make_shared<Buffer>(tag, std::move(data))); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | } // namespace AudioCore
 |