[XMP] Make volume atomic, fixed issue with invalid SetVolume received from guest
- Replaced invalid log
This commit is contained in:
@@ -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_);
|
||||
}
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -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_) {
|
||||
|
||||
@@ -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_;
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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);
|
||||
|
||||
|
||||
Reference in New Issue
Block a user