mirror of
https://github.com/RGBCube/serenity
synced 2025-07-27 12:47:35 +00:00
WebContent: Replace the Serenity audio plugin with the agnostic one
The behavior of the Serenity `PlaybackStream` implementation should match the `AudioCodecPluginSerenity` class removed by this commit. Any inconsistencies should be fixable without needing feature additions to the underlying implementation.
This commit is contained in:
parent
88190202cc
commit
9d65965060
4 changed files with 2 additions and 156 deletions
|
@ -1,107 +0,0 @@
|
||||||
/*
|
|
||||||
* Copyright (c) 2023, Tim Flynn <trflynn89@serenityos.org>
|
|
||||||
*
|
|
||||||
* SPDX-License-Identifier: BSD-2-Clause
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include <LibAudio/ConnectionToServer.h>
|
|
||||||
#include <LibAudio/Loader.h>
|
|
||||||
#include <LibAudio/Sample.h>
|
|
||||||
#include <LibWeb/Platform/Timer.h>
|
|
||||||
#include <WebContent/AudioCodecPluginSerenity.h>
|
|
||||||
|
|
||||||
namespace WebContent {
|
|
||||||
|
|
||||||
// These constants and this implementation is based heavily on SoundPlayer::PlaybackManager.
|
|
||||||
static constexpr u32 UPDATE_RATE_MS = 50;
|
|
||||||
static constexpr u32 BUFFER_SIZE_MS = 100;
|
|
||||||
static constexpr size_t ALWAYS_ENQUEUED_BUFFER_COUNT = 5;
|
|
||||||
|
|
||||||
ErrorOr<NonnullOwnPtr<AudioCodecPluginSerenity>> AudioCodecPluginSerenity::create(NonnullRefPtr<Audio::Loader> loader)
|
|
||||||
{
|
|
||||||
auto connection = TRY(Audio::ConnectionToServer::try_create());
|
|
||||||
return adopt_nonnull_own_or_enomem(new (nothrow) AudioCodecPluginSerenity(move(connection), move(loader)));
|
|
||||||
}
|
|
||||||
|
|
||||||
AudioCodecPluginSerenity::AudioCodecPluginSerenity(NonnullRefPtr<Audio::ConnectionToServer> connection, NonnullRefPtr<Audio::Loader> loader)
|
|
||||||
: m_connection(move(connection))
|
|
||||||
, m_loader(move(loader))
|
|
||||||
, m_sample_timer(Web::Platform::Timer::create_repeating(UPDATE_RATE_MS, [this]() {
|
|
||||||
if (play_next_samples().is_error()) {
|
|
||||||
// FIXME: Propagate the error to the HTMLMediaElement.
|
|
||||||
} else {
|
|
||||||
if (on_playback_position_updated)
|
|
||||||
on_playback_position_updated(m_position);
|
|
||||||
}
|
|
||||||
}))
|
|
||||||
{
|
|
||||||
auto duration = static_cast<double>(m_loader->total_samples()) / static_cast<double>(m_loader->sample_rate());
|
|
||||||
m_duration = Duration::from_milliseconds(static_cast<i64>(duration * 1000.0));
|
|
||||||
|
|
||||||
m_samples_to_load_per_buffer = static_cast<size_t>(BUFFER_SIZE_MS / 1000.0 * static_cast<double>(m_loader->sample_rate()));
|
|
||||||
|
|
||||||
m_connection->set_self_sample_rate(m_loader->sample_rate());
|
|
||||||
}
|
|
||||||
|
|
||||||
AudioCodecPluginSerenity::~AudioCodecPluginSerenity() = default;
|
|
||||||
|
|
||||||
ErrorOr<void> AudioCodecPluginSerenity::play_next_samples()
|
|
||||||
{
|
|
||||||
while (m_connection->remaining_samples() < m_samples_to_load_per_buffer * ALWAYS_ENQUEUED_BUFFER_COUNT) {
|
|
||||||
bool all_samples_loaded = m_loader->loaded_samples() >= m_loader->total_samples();
|
|
||||||
bool audio_server_done = m_connection->remaining_samples() == 0;
|
|
||||||
|
|
||||||
if (all_samples_loaded && audio_server_done) {
|
|
||||||
pause_playback();
|
|
||||||
|
|
||||||
m_connection->clear_client_buffer();
|
|
||||||
m_connection->async_clear_buffer();
|
|
||||||
(void)m_loader->reset();
|
|
||||||
|
|
||||||
m_position = m_duration;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
auto samples = TRY(read_samples_from_loader(m_loader, m_samples_to_load_per_buffer));
|
|
||||||
TRY(m_connection->async_enqueue(move(samples)));
|
|
||||||
|
|
||||||
m_position = current_loader_position(m_loader);
|
|
||||||
}
|
|
||||||
|
|
||||||
return {};
|
|
||||||
}
|
|
||||||
|
|
||||||
void AudioCodecPluginSerenity::resume_playback()
|
|
||||||
{
|
|
||||||
m_connection->async_start_playback();
|
|
||||||
m_sample_timer->start();
|
|
||||||
}
|
|
||||||
|
|
||||||
void AudioCodecPluginSerenity::pause_playback()
|
|
||||||
{
|
|
||||||
m_connection->async_pause_playback();
|
|
||||||
m_sample_timer->stop();
|
|
||||||
}
|
|
||||||
|
|
||||||
void AudioCodecPluginSerenity::set_volume(double volume)
|
|
||||||
{
|
|
||||||
m_connection->async_set_self_volume(volume);
|
|
||||||
}
|
|
||||||
|
|
||||||
void AudioCodecPluginSerenity::seek(double position)
|
|
||||||
{
|
|
||||||
m_position = set_loader_position(m_loader, position, m_duration);
|
|
||||||
|
|
||||||
m_connection->clear_client_buffer();
|
|
||||||
m_connection->async_clear_buffer();
|
|
||||||
|
|
||||||
if (on_playback_position_updated)
|
|
||||||
on_playback_position_updated(m_position);
|
|
||||||
}
|
|
||||||
|
|
||||||
Duration AudioCodecPluginSerenity::duration()
|
|
||||||
{
|
|
||||||
return m_duration;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
|
@ -1,46 +0,0 @@
|
||||||
/*
|
|
||||||
* Copyright (c) 2023, Tim Flynn <trflynn89@serenityos.org>
|
|
||||||
*
|
|
||||||
* SPDX-License-Identifier: BSD-2-Clause
|
|
||||||
*/
|
|
||||||
|
|
||||||
#pragma once
|
|
||||||
|
|
||||||
#include <AK/Error.h>
|
|
||||||
#include <AK/NonnullOwnPtr.h>
|
|
||||||
#include <AK/NonnullRefPtr.h>
|
|
||||||
#include <AK/Time.h>
|
|
||||||
#include <LibAudio/Forward.h>
|
|
||||||
#include <LibWeb/Forward.h>
|
|
||||||
#include <LibWeb/Platform/AudioCodecPlugin.h>
|
|
||||||
|
|
||||||
namespace WebContent {
|
|
||||||
|
|
||||||
class AudioCodecPluginSerenity final : public Web::Platform::AudioCodecPlugin {
|
|
||||||
public:
|
|
||||||
static ErrorOr<NonnullOwnPtr<AudioCodecPluginSerenity>> create(NonnullRefPtr<Audio::Loader>);
|
|
||||||
virtual ~AudioCodecPluginSerenity() override;
|
|
||||||
|
|
||||||
virtual void resume_playback() override;
|
|
||||||
virtual void pause_playback() override;
|
|
||||||
virtual void set_volume(double) override;
|
|
||||||
virtual void seek(double) override;
|
|
||||||
|
|
||||||
virtual Duration duration() override;
|
|
||||||
|
|
||||||
private:
|
|
||||||
AudioCodecPluginSerenity(NonnullRefPtr<Audio::ConnectionToServer>, NonnullRefPtr<Audio::Loader>);
|
|
||||||
|
|
||||||
ErrorOr<void> play_next_samples();
|
|
||||||
|
|
||||||
NonnullRefPtr<Audio::ConnectionToServer> m_connection;
|
|
||||||
NonnullRefPtr<Audio::Loader> m_loader;
|
|
||||||
NonnullRefPtr<Web::Platform::Timer> m_sample_timer;
|
|
||||||
|
|
||||||
Duration m_duration;
|
|
||||||
Duration m_position;
|
|
||||||
|
|
||||||
size_t m_samples_to_load_per_buffer { 0 };
|
|
||||||
};
|
|
||||||
|
|
||||||
}
|
|
|
@ -11,7 +11,6 @@ compile_ipc(WebDriverClient.ipc WebDriverClientEndpoint.h)
|
||||||
compile_ipc(WebDriverServer.ipc WebDriverServerEndpoint.h)
|
compile_ipc(WebDriverServer.ipc WebDriverServerEndpoint.h)
|
||||||
|
|
||||||
set(SOURCES
|
set(SOURCES
|
||||||
AudioCodecPluginSerenity.cpp
|
|
||||||
ConnectionFromClient.cpp
|
ConnectionFromClient.cpp
|
||||||
ConsoleGlobalEnvironmentExtensions.cpp
|
ConsoleGlobalEnvironmentExtensions.cpp
|
||||||
ImageCodecPluginSerenity.cpp
|
ImageCodecPluginSerenity.cpp
|
||||||
|
|
|
@ -4,7 +4,6 @@
|
||||||
* SPDX-License-Identifier: BSD-2-Clause
|
* SPDX-License-Identifier: BSD-2-Clause
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "AudioCodecPluginSerenity.h"
|
|
||||||
#include "ImageCodecPluginSerenity.h"
|
#include "ImageCodecPluginSerenity.h"
|
||||||
#include <LibAudio/Loader.h>
|
#include <LibAudio/Loader.h>
|
||||||
#include <LibCore/EventLoop.h>
|
#include <LibCore/EventLoop.h>
|
||||||
|
@ -16,6 +15,7 @@
|
||||||
#include <LibMain/Main.h>
|
#include <LibMain/Main.h>
|
||||||
#include <LibWeb/Bindings/MainThreadVM.h>
|
#include <LibWeb/Bindings/MainThreadVM.h>
|
||||||
#include <LibWeb/Loader/ResourceLoader.h>
|
#include <LibWeb/Loader/ResourceLoader.h>
|
||||||
|
#include <LibWeb/Platform/AudioCodecPluginAgnostic.h>
|
||||||
#include <LibWeb/Platform/EventLoopPlugin.h>
|
#include <LibWeb/Platform/EventLoopPlugin.h>
|
||||||
#include <LibWeb/Platform/EventLoopPluginSerenity.h>
|
#include <LibWeb/Platform/EventLoopPluginSerenity.h>
|
||||||
#include <LibWeb/Platform/FontPluginSerenity.h>
|
#include <LibWeb/Platform/FontPluginSerenity.h>
|
||||||
|
@ -48,7 +48,7 @@ ErrorOr<int> serenity_main(Main::Arguments)
|
||||||
Web::Platform::FontPlugin::install(*new Web::Platform::FontPluginSerenity);
|
Web::Platform::FontPlugin::install(*new Web::Platform::FontPluginSerenity);
|
||||||
|
|
||||||
Web::Platform::AudioCodecPlugin::install_creation_hook([](auto loader) {
|
Web::Platform::AudioCodecPlugin::install_creation_hook([](auto loader) {
|
||||||
return WebContent::AudioCodecPluginSerenity::create(move(loader));
|
return Web::Platform::AudioCodecPluginAgnostic::create(move(loader));
|
||||||
});
|
});
|
||||||
|
|
||||||
Web::WebSockets::WebSocketClientManager::initialize(TRY(WebView::WebSocketClientManagerAdapter::try_create()));
|
Web::WebSockets::WebSocketClientManager::initialize(TRY(WebView::WebSocketClientManagerAdapter::try_create()));
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue