[XMP] Make volume atomic, fixed issue with invalid SetVolume received from guest

- Replaced invalid log
This commit is contained in:
Gliniak
2025-10-28 20:11:47 +01:00
parent a25bbed1c3
commit 344e8538e0
6 changed files with 12 additions and 7 deletions

View File

@@ -688,6 +688,9 @@ void EmulatorWindow::XMPConfigDialog::OnDraw(ImGuiIO& io) {
}
}
volume_ =
emulator_window_.emulator_->audio_media_player()->GetVolume()->load();
if (ImGui::SliderFloat("Audio player volume", &volume_, 0.0f, 1.0f)) {
audio_player->SetVolume(volume_);
}

View File

@@ -215,7 +215,9 @@ class EmulatorWindow {
EmulatorWindow& emulator_window)
: ui::ImGuiDialog(imgui_drawer), emulator_window_(emulator_window) {
if (emulator_window_.emulator_->audio_media_player()) {
volume_ = emulator_window_.emulator_->audio_media_player()->GetVolume();
volume_ = emulator_window_.emulator_->audio_media_player()
->GetVolume()
->load();
}
}

View File

@@ -448,7 +448,7 @@ void AudioMediaPlayer::RemovePlaylist(uint32_t handle) {
}
X_STATUS AudioMediaPlayer::SetVolume(float volume) {
volume_ = std::min(volume, 1.0f);
volume_.store(std::min(volume, 1.0f));
std::unique_lock<xe_mutex> guard(driver_mutex_);
if (!driver_) {

View File

@@ -51,7 +51,7 @@ class AudioMediaPlayer {
bool IsLastSongInPlaylist() const;
X_STATUS SetVolume(float volume);
float GetVolume() const { return volume_; }
const std::atomic<float>* GetVolume() const { return &volume_; }
void SetPlaybackMode(XmpApp::PlaybackMode playback_mode) {
playback_mode_ = playback_mode;
@@ -106,7 +106,7 @@ class AudioMediaPlayer {
XmpApp::PlaybackMode playback_mode_ = XmpApp::PlaybackMode::kInOrder;
XmpApp::RepeatMode repeat_mode_ = XmpApp::RepeatMode::kPlaylist;
XmpApp::PlaybackFlags playback_flags_ = XmpApp::PlaybackFlags::kDefault;
float volume_ = 0.0f;
std::atomic<float> volume_ = 0.0f;
uint32_t dash_init_state = 0;
std::unordered_map<uint32_t, std::unique_ptr<XmpApp::Playlist>> playlists_;

View File

@@ -262,7 +262,7 @@ X_HRESULT XmpApp::DispatchMessageSync(uint32_t message, uint32_t buffer_ptr,
xe::store_and_swap<float>(
memory_->TranslateVirtual(args->volume_ptr),
kernel_state_->emulator()->audio_media_player()->GetVolume());
kernel_state_->emulator()->audio_media_player()->GetVolume()->load());
return X_E_SUCCESS;
}
case 0x0007000C: {
@@ -401,7 +401,7 @@ X_HRESULT XmpApp::DispatchMessageSync(uint32_t message, uint32_t buffer_ptr,
XMP_CREATE_USER_PLAYLIST_ENUMERATOR* args =
reinterpret_cast<XMP_CREATE_USER_PLAYLIST_ENUMERATOR*>(buffer);
XELOGD("XMPSetPlaybackController({:08X}, {:08X}, {:08X})",
XELOGD("XMPCreateUserPlaylistEnumerator({:08X}, {:08X}, {:08X})",
uint32_t(args->xmp_client), uint32_t(args->flags),
uint32_t(args->unk_ptr));
return X_E_SUCCESS;

View File

@@ -86,7 +86,7 @@ static_assert_size(XMP_GET_VOLUME, 0x8);
struct XMP_SET_VOLUME {
xe::be<uint32_t> xmp_client;
xe::be<uint32_t> value;
xe::be<float> value;
};
static_assert_size(XMP_SET_VOLUME, 0x8);