Remember sound devices
This commit is contained in:
parent
25d4f27a9b
commit
a00d357bef
3 changed files with 54 additions and 22 deletions
|
@ -133,6 +133,14 @@ struct platform
|
|||
* Set sound device.
|
||||
*/
|
||||
static void set_sound_device(const std::string& pdev, const std::string& rdev) throw();
|
||||
/**
|
||||
* Set sound device by description.
|
||||
*/
|
||||
static void set_sound_device_by_description(const std::string& pdev, const std::string& rdev) throw();
|
||||
/**
|
||||
* Get sound device description.
|
||||
*/
|
||||
static std::string get_sound_device_description(bool rec) throw(std::bad_alloc);
|
||||
/**
|
||||
* Show error message dialog after UI thread becomes free.
|
||||
*
|
||||
|
|
|
@ -138,33 +138,16 @@ namespace
|
|||
"Syntax: reset-audio\nResets the audio driver.\n",
|
||||
[]() throw(std::bad_alloc, std::runtime_error) {
|
||||
//Save the old devices. We save descriptions if possible, since handles change.
|
||||
auto pdevs = audioapi_driver_get_devices(false);
|
||||
auto rdevs = audioapi_driver_get_devices(true);
|
||||
auto cpdev = audioapi_driver_get_device(false);
|
||||
auto crdev = audioapi_driver_get_device(true);
|
||||
cpdev = pdevs.count(cpdev) ? pdevs[cpdev] : std::string("");
|
||||
crdev = rdevs.count(crdev) ? rdevs[crdev] : std::string("");
|
||||
auto cpdev = platform::get_sound_device_description(false);
|
||||
auto crdev = platform::get_sound_device_description(true);
|
||||
//Restart the system.
|
||||
audioapi_driver_quit();
|
||||
audioapi_driver_init();
|
||||
//Try to find the devices again.
|
||||
pdevs = audioapi_driver_get_devices(false);
|
||||
rdevs = audioapi_driver_get_devices(true);
|
||||
for(auto i : pdevs)
|
||||
if(i.second == cpdev) {
|
||||
cpdev = i.first;
|
||||
break;
|
||||
}
|
||||
for(auto i : rdevs)
|
||||
if(i.second == crdev) {
|
||||
crdev = i.first;
|
||||
break;
|
||||
}
|
||||
//Defaults.
|
||||
if(cpdev == "") cpdev = audioapi_driver_get_device(false);
|
||||
if(crdev == "") crdev = audioapi_driver_get_device(true);
|
||||
if(cpdev == "") cpdev = platform::get_sound_device_description(false);
|
||||
if(crdev == "") crdev = platform::get_sound_device_description(true);
|
||||
//Try to change device back.
|
||||
platform::set_sound_device(cpdev, crdev);
|
||||
platform::set_sound_device_by_description(cpdev, crdev);
|
||||
});
|
||||
|
||||
keyboard::invbind_info ienable_sound(lsnes_invbinds, "enable-sound on", "Sound‣Enable");
|
||||
|
@ -250,6 +233,36 @@ void platform::set_sound_device(const std::string& pdev, const std::string& rdev
|
|||
audioapi_driver_get_device(false)));
|
||||
}
|
||||
|
||||
void platform::set_sound_device_by_description(const std::string& pdev, const std::string& rdev) throw()
|
||||
{
|
||||
std::string old_play = audioapi_driver_get_device(false);
|
||||
std::string old_rec = audioapi_driver_get_device(true);
|
||||
auto pdevs = audioapi_driver_get_devices(false);
|
||||
auto rdevs = audioapi_driver_get_devices(true);
|
||||
for(auto i : pdevs)
|
||||
if(i.second == pdev) {
|
||||
old_play = i.first;
|
||||
break;
|
||||
}
|
||||
for(auto i : rdevs)
|
||||
if(i.second == rdev) {
|
||||
old_rec = i.first;
|
||||
break;
|
||||
}
|
||||
set_sound_device(old_play, old_rec);
|
||||
}
|
||||
|
||||
std::string platform::get_sound_device_description(bool rec) throw(std::bad_alloc)
|
||||
{
|
||||
auto dev = audioapi_driver_get_device(rec);
|
||||
auto devs = audioapi_driver_get_devices(rec);
|
||||
if(devs.count(dev))
|
||||
return devs[dev];
|
||||
else
|
||||
return "";
|
||||
}
|
||||
|
||||
|
||||
bool platform::is_sound_enabled() throw()
|
||||
{
|
||||
return sounds_enabled;
|
||||
|
|
|
@ -162,6 +162,9 @@ end:
|
|||
wxPostEvent(ui_services, uic);
|
||||
}
|
||||
|
||||
std::string loaded_pdev;
|
||||
std::string loaded_rdev;
|
||||
|
||||
void handle_config_line(std::string line)
|
||||
{
|
||||
regex_results r;
|
||||
|
@ -198,6 +201,10 @@ end:
|
|||
core_selections[r[1]] = r[2];
|
||||
messages << "Prefer " << r[2] << " for " << r[1] << std::endl;
|
||||
}
|
||||
} else if(r = regex("AUDIO_PDEV[ \t]+(.*)", line)) {
|
||||
loaded_pdev = r[1];
|
||||
} else if(r = regex("AUDIO_RDEV[ \t]+(.*)", line)) {
|
||||
loaded_rdev = r[1];
|
||||
} else
|
||||
(stringfmt() << "Unrecognized directive: " << line).throwex();
|
||||
}
|
||||
|
@ -216,6 +223,7 @@ end:
|
|||
}
|
||||
lineno++;
|
||||
}
|
||||
platform::set_sound_device_by_description(loaded_pdev, loaded_rdev);
|
||||
(*lsnes_instance.abindmanager)();
|
||||
lsnes_uri_rewrite.load(get_config_path() + "/lsnesurirewrite.cfg");
|
||||
}
|
||||
|
@ -259,6 +267,9 @@ end:
|
|||
for(auto i : core_selections)
|
||||
if(i.second != "")
|
||||
cfgfile << "PREFER " << i.first << " " << i.second << std::endl;
|
||||
//Sound config.
|
||||
cfgfile << "AUDIO_PDEV " << platform::get_sound_device_description(false) << std::endl;
|
||||
cfgfile << "AUDIO_RDEV " << platform::get_sound_device_description(true) << std::endl;
|
||||
if(!cfgfile) {
|
||||
show_message_ok(NULL, "Error Saving configuration", "Error saving configuration",
|
||||
wxICON_EXCLAMATION);
|
||||
|
|
Loading…
Add table
Reference in a new issue