mixer/Control: move some code to Lock*() methods
This commit is contained in:
@@ -41,92 +41,8 @@ mixer_free(Mixer *mixer) noexcept
|
||||
assert(mixer != nullptr);
|
||||
|
||||
/* mixers with the "global" flag set might still be open at
|
||||
this point (see mixer_auto_close()) */
|
||||
mixer_close(*mixer);
|
||||
this point (see Mixer::LockAutoClose()) */
|
||||
mixer->LockClose();
|
||||
|
||||
delete mixer;
|
||||
}
|
||||
|
||||
void
|
||||
mixer_open(Mixer &mixer)
|
||||
{
|
||||
const std::scoped_lock<Mutex> protect(mixer.mutex);
|
||||
|
||||
if (mixer.open)
|
||||
return;
|
||||
|
||||
try {
|
||||
mixer.Open();
|
||||
mixer.open = true;
|
||||
mixer.failure = {};
|
||||
} catch (...) {
|
||||
mixer.failure = std::current_exception();
|
||||
throw;
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
mixer_close_internal(Mixer &mixer) noexcept
|
||||
{
|
||||
assert(mixer.open);
|
||||
|
||||
mixer.Close();
|
||||
mixer.open = false;
|
||||
mixer.failure = {};
|
||||
}
|
||||
|
||||
void
|
||||
mixer_close(Mixer &mixer) noexcept
|
||||
{
|
||||
const std::scoped_lock<Mutex> protect(mixer.mutex);
|
||||
|
||||
if (mixer.open)
|
||||
mixer_close_internal(mixer);
|
||||
}
|
||||
|
||||
void
|
||||
mixer_auto_close(Mixer &mixer) noexcept
|
||||
{
|
||||
if (!mixer.IsGlobal())
|
||||
mixer_close(mixer);
|
||||
}
|
||||
|
||||
int
|
||||
mixer_get_volume(Mixer &mixer)
|
||||
{
|
||||
int volume;
|
||||
|
||||
if (mixer.IsGlobal() && !mixer.failure)
|
||||
mixer_open(mixer);
|
||||
|
||||
const std::scoped_lock<Mutex> protect(mixer.mutex);
|
||||
|
||||
if (mixer.open) {
|
||||
try {
|
||||
volume = mixer.GetVolume();
|
||||
} catch (...) {
|
||||
mixer_close_internal(mixer);
|
||||
mixer.failure = std::current_exception();
|
||||
throw;
|
||||
}
|
||||
} else
|
||||
volume = -1;
|
||||
|
||||
return volume;
|
||||
}
|
||||
|
||||
void
|
||||
mixer_set_volume(Mixer &mixer, unsigned volume)
|
||||
{
|
||||
assert(volume <= 100);
|
||||
|
||||
if (mixer.IsGlobal() && !mixer.failure)
|
||||
mixer_open(mixer);
|
||||
|
||||
const std::scoped_lock<Mutex> protect(mixer.mutex);
|
||||
|
||||
if (mixer.open)
|
||||
mixer.SetVolume(volume);
|
||||
else if (mixer.failure)
|
||||
std::rethrow_exception(mixer.failure);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user