[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)) {
|
if (ImGui::SliderFloat("Audio player volume", &volume_, 0.0f, 1.0f)) {
|
||||||
audio_player->SetVolume(volume_);
|
audio_player->SetVolume(volume_);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -215,7 +215,9 @@ class EmulatorWindow {
|
|||||||
EmulatorWindow& emulator_window)
|
EmulatorWindow& emulator_window)
|
||||||
: ui::ImGuiDialog(imgui_drawer), emulator_window_(emulator_window) {
|
: ui::ImGuiDialog(imgui_drawer), emulator_window_(emulator_window) {
|
||||||
if (emulator_window_.emulator_->audio_media_player()) {
|
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) {
|
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_);
|
std::unique_lock<xe_mutex> guard(driver_mutex_);
|
||||||
if (!driver_) {
|
if (!driver_) {
|
||||||
|
|||||||
@@ -51,7 +51,7 @@ class AudioMediaPlayer {
|
|||||||
bool IsLastSongInPlaylist() const;
|
bool IsLastSongInPlaylist() const;
|
||||||
|
|
||||||
X_STATUS SetVolume(float volume);
|
X_STATUS SetVolume(float volume);
|
||||||
float GetVolume() const { return volume_; }
|
const std::atomic<float>* GetVolume() const { return &volume_; }
|
||||||
|
|
||||||
void SetPlaybackMode(XmpApp::PlaybackMode playback_mode) {
|
void SetPlaybackMode(XmpApp::PlaybackMode playback_mode) {
|
||||||
playback_mode_ = playback_mode;
|
playback_mode_ = playback_mode;
|
||||||
@@ -106,7 +106,7 @@ class AudioMediaPlayer {
|
|||||||
XmpApp::PlaybackMode playback_mode_ = XmpApp::PlaybackMode::kInOrder;
|
XmpApp::PlaybackMode playback_mode_ = XmpApp::PlaybackMode::kInOrder;
|
||||||
XmpApp::RepeatMode repeat_mode_ = XmpApp::RepeatMode::kPlaylist;
|
XmpApp::RepeatMode repeat_mode_ = XmpApp::RepeatMode::kPlaylist;
|
||||||
XmpApp::PlaybackFlags playback_flags_ = XmpApp::PlaybackFlags::kDefault;
|
XmpApp::PlaybackFlags playback_flags_ = XmpApp::PlaybackFlags::kDefault;
|
||||||
float volume_ = 0.0f;
|
std::atomic<float> volume_ = 0.0f;
|
||||||
uint32_t dash_init_state = 0;
|
uint32_t dash_init_state = 0;
|
||||||
|
|
||||||
std::unordered_map<uint32_t, std::unique_ptr<XmpApp::Playlist>> playlists_;
|
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>(
|
xe::store_and_swap<float>(
|
||||||
memory_->TranslateVirtual(args->volume_ptr),
|
memory_->TranslateVirtual(args->volume_ptr),
|
||||||
kernel_state_->emulator()->audio_media_player()->GetVolume());
|
kernel_state_->emulator()->audio_media_player()->GetVolume()->load());
|
||||||
return X_E_SUCCESS;
|
return X_E_SUCCESS;
|
||||||
}
|
}
|
||||||
case 0x0007000C: {
|
case 0x0007000C: {
|
||||||
@@ -401,7 +401,7 @@ X_HRESULT XmpApp::DispatchMessageSync(uint32_t message, uint32_t buffer_ptr,
|
|||||||
XMP_CREATE_USER_PLAYLIST_ENUMERATOR* args =
|
XMP_CREATE_USER_PLAYLIST_ENUMERATOR* args =
|
||||||
reinterpret_cast<XMP_CREATE_USER_PLAYLIST_ENUMERATOR*>(buffer);
|
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->xmp_client), uint32_t(args->flags),
|
||||||
uint32_t(args->unk_ptr));
|
uint32_t(args->unk_ptr));
|
||||||
return X_E_SUCCESS;
|
return X_E_SUCCESS;
|
||||||
|
|||||||
@@ -86,7 +86,7 @@ static_assert_size(XMP_GET_VOLUME, 0x8);
|
|||||||
|
|
||||||
struct XMP_SET_VOLUME {
|
struct XMP_SET_VOLUME {
|
||||||
xe::be<uint32_t> xmp_client;
|
xe::be<uint32_t> xmp_client;
|
||||||
xe::be<uint32_t> value;
|
xe::be<float> value;
|
||||||
};
|
};
|
||||||
static_assert_size(XMP_SET_VOLUME, 0x8);
|
static_assert_size(XMP_SET_VOLUME, 0x8);
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user