| 
									
										
										
										
											2023-06-12 13:44:10 -04:00
										 |  |  | /*
 | 
					
						
							|  |  |  |  * Copyright (c) 2023, Tim Flynn <trflynn89@serenityos.org> | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * SPDX-License-Identifier: BSD-2-Clause | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-09-30 14:49:59 +02:00
										 |  |  | #include <AK/Time.h>
 | 
					
						
							| 
									
										
										
										
											2024-08-28 12:08:38 +02:00
										 |  |  | #include <LibMedia/Audio/Loader.h>
 | 
					
						
							|  |  |  | #include <LibMedia/Audio/Sample.h>
 | 
					
						
							| 
									
										
										
										
											2023-06-12 13:44:10 -04:00
										 |  |  | #include <LibWeb/Platform/AudioCodecPlugin.h>
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | namespace Web::Platform { | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-06-20 12:43:04 -04:00
										 |  |  | static AudioCodecPlugin::AudioCodecPluginCreator s_creation_hook; | 
					
						
							| 
									
										
										
										
											2023-06-12 13:44:10 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  | AudioCodecPlugin::AudioCodecPlugin() = default; | 
					
						
							|  |  |  | AudioCodecPlugin::~AudioCodecPlugin() = default; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-06-20 12:43:04 -04:00
										 |  |  | void AudioCodecPlugin::install_creation_hook(AudioCodecPluginCreator creation_hook) | 
					
						
							| 
									
										
										
										
											2023-06-12 13:44:10 -04:00
										 |  |  | { | 
					
						
							|  |  |  |     VERIFY(!s_creation_hook); | 
					
						
							|  |  |  |     s_creation_hook = move(creation_hook); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-06-20 12:43:04 -04:00
										 |  |  | ErrorOr<NonnullOwnPtr<AudioCodecPlugin>> AudioCodecPlugin::create(NonnullRefPtr<Audio::Loader> loader) | 
					
						
							| 
									
										
										
										
											2023-06-12 13:44:10 -04:00
										 |  |  | { | 
					
						
							|  |  |  |     VERIFY(s_creation_hook); | 
					
						
							| 
									
										
										
										
											2023-06-20 12:43:04 -04:00
										 |  |  |     return s_creation_hook(move(loader)); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-06-24 13:42:06 +02:00
										 |  |  | ErrorOr<FixedArray<Audio::Sample>> AudioCodecPlugin::read_samples_from_loader(Audio::Loader& loader, size_t samples_to_load) | 
					
						
							| 
									
										
										
										
											2023-06-20 12:43:04 -04:00
										 |  |  | { | 
					
						
							|  |  |  |     auto buffer_or_error = loader.get_more_samples(samples_to_load); | 
					
						
							|  |  |  |     if (buffer_or_error.is_error()) { | 
					
						
							| 
									
										
										
										
											2024-11-21 20:06:00 +01:00
										 |  |  |         dbgln("Error while loading samples: {}", buffer_or_error.error()); | 
					
						
							| 
									
										
										
										
											2023-06-20 12:43:04 -04:00
										 |  |  |         return Error::from_string_literal("Error while loading samples"); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-06-24 13:42:06 +02:00
										 |  |  |     return buffer_or_error.release_value(); | 
					
						
							| 
									
										
										
										
											2023-06-20 12:43:04 -04:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-07-16 23:45:44 -06:00
										 |  |  | AK::Duration AudioCodecPlugin::set_loader_position(Audio::Loader& loader, double position, AK::Duration duration) | 
					
						
							| 
									
										
										
										
											2023-06-21 19:37:10 -04:00
										 |  |  | { | 
					
						
							|  |  |  |     if (loader.total_samples() == 0) | 
					
						
							| 
									
										
										
										
											2023-06-24 13:42:06 +02:00
										 |  |  |         return current_loader_position(loader); | 
					
						
							| 
									
										
										
										
											2023-06-21 19:37:10 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  |     auto duration_value = static_cast<double>(duration.to_milliseconds()) / 1000.0; | 
					
						
							|  |  |  |     position = position / duration_value * static_cast<double>(loader.total_samples() - 1); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     loader.seek(static_cast<int>(position)).release_value_but_fixme_should_propagate_errors(); | 
					
						
							| 
									
										
										
										
											2023-06-24 13:42:06 +02:00
										 |  |  |     return current_loader_position(loader); | 
					
						
							| 
									
										
										
										
											2023-06-21 19:37:10 -04:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-07-16 23:45:44 -06:00
										 |  |  | AK::Duration AudioCodecPlugin::current_loader_position(Audio::Loader const& loader) | 
					
						
							| 
									
										
										
										
											2023-06-20 12:43:04 -04:00
										 |  |  | { | 
					
						
							|  |  |  |     auto samples_played = static_cast<double>(loader.loaded_samples()); | 
					
						
							|  |  |  |     auto sample_rate = static_cast<double>(loader.sample_rate()); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-07-16 23:45:44 -06:00
										 |  |  |     return AK::Duration::from_milliseconds(static_cast<i64>(samples_played / sample_rate * 1000.0)); | 
					
						
							| 
									
										
										
										
											2023-06-12 13:44:10 -04:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | } |