Changed sound driver parameter type to bx_param_enum_c.

TODO: Add sound driver selection per service (waveout, wavein, midiout).
This commit is contained in:
Volker Ruppert 2015-02-22 20:29:58 +00:00
parent 66ee9dce05
commit 3135e6a4eb
5 changed files with 78 additions and 36 deletions

View File

@ -2,7 +2,7 @@
// $Id$
/////////////////////////////////////////////////////////////////////////
//
// Copyright (C) 2002-2014 The Bochs Project
// Copyright (C) 2002-2015 The Bochs Project
//
// This library is free software; you can redistribute it and/or
// modify it under the terms of the GNU Lesser General Public
@ -1505,11 +1505,14 @@ void bx_init_options()
soundlow->set_enabled(BX_SUPPORT_SOUNDLOW);
#if BX_SUPPORT_SOUNDLOW
new bx_param_string_c(soundlow,
bx_param_enum_c *driver = new bx_param_enum_c(soundlow,
"driver",
"Sound driver",
"This is the lowlevel driver to use for emulated sound devices",
"default", BX_PATHNAME_LEN);
sound_driver_names,
BX_SOUNDDRV_DUMMY,
BX_SOUNDDRV_DUMMY);
driver->set_by_name(BX_SOUND_LOWLEVEL_NAME);
new bx_param_filename_c(soundlow,
"waveout",
"Wave output device",
@ -2882,7 +2885,9 @@ static int parse_line_formatted(const char *context, int num_params, char *param
} else if (!strcmp(params[0], "sound")) {
#if BX_SUPPORT_SOUNDLOW
for (i=1; i<num_params; i++) {
if (bx_parse_param_from_list(context, params[i], (bx_list_c*) SIM->get_param(BXPN_SOUNDLOW)) < 0) {
if (!strcmp(params[i], "driver=default")) {
SIM->get_param_enum(BXPN_SOUND_DRIVER)->set_by_name(BX_SOUND_LOWLEVEL_NAME);
} else if (bx_parse_param_from_list(context, params[i], (bx_list_c*) SIM->get_param(BXPN_SOUNDLOW)) < 0) {
BX_ERROR(("%s: unknown parameter for sound ignored.", context));
}
}

View File

@ -2,7 +2,7 @@
// $Id$
/////////////////////////////////////////////////////////////////////////
//
// Copyright (C) 2002-2014 The Bochs Project
// Copyright (C) 2002-2015 The Bochs Project
//
// This library is free software; you can redistribute it and/or
// modify it under the terms of the GNU Lesser General Public
@ -503,7 +503,28 @@ int floppy_type_n_sectors[] = { -1, 80*2*15, 80*2*18, 80*2*36, 80*2*9, 40*2*9, 4
const char *media_status_names[] = { "ejected", "inserted", NULL };
const char *bochs_bootdisk_names[] = { "none", "floppy", "disk","cdrom", "network", NULL };
const char *hdimage_mode_names[] = {
const char *sound_driver_names[] = {
"dummy",
#if BX_HAVE_ALSASOUND
"alsa",
#endif
#if (defined(linux) || defined(__FreeBSD__) || defined(__FreeBSD_kernel__))
"oss",
#endif
#if defined(macintosh)
"osx",
#endif
#if BX_WITH_SDL || BX_WITH_SDL2
"sdl",
#endif
#if defined(WIN32)
"win",
#endif
"file",
NULL
};
const char *hdimage_mode_names[] = {
"flat",
"concat",
"external",

View File

@ -2,7 +2,7 @@
// $Id$
/////////////////////////////////////////////////////////////////////////
//
// Copyright (C) 2001-2014 The Bochs Project
// Copyright (C) 2001-2015 The Bochs Project
//
// This library is free software; you can redistribute it and/or
// modify it under the terms of the GNU Lesser General Public
@ -593,12 +593,33 @@ enum {
#define BX_CLOCK_TIME0_LOCAL 1
#define BX_CLOCK_TIME0_UTC 2
enum {
BX_SOUNDDRV_DUMMY,
#if BX_HAVE_ALSASOUND
BX_SOUNDDRV_ALSA,
#endif
#if (defined(linux) || defined(__FreeBSD__) || defined(__FreeBSD_kernel__))
BX_SOUNDDRV_OSS,
#endif
#if defined(macintosh)
BX_SOUNDDRV_OSX,
#endif
#if BX_WITH_SDL || BX_WITH_SDL2
BX_SOUNDDRV_SDL,
#endif
#if defined(WIN32)
BX_SOUNDDRV_WIN,
#endif
BX_SOUNDDRV_FILE
};
BOCHSAPI extern const char *floppy_devtype_names[];
BOCHSAPI extern const char *floppy_type_names[];
BOCHSAPI extern int floppy_type_n_sectors[];
BOCHSAPI extern const char *media_status_names[];
BOCHSAPI extern const char *bochs_bootdisk_names[];
BOCHSAPI extern const char *hdimage_mode_names[];
BOCHSAPI extern const char *sound_driver_names[];
////////////////////////////////////////////////////////////////////
// base class simulator interface, contains just virtual functions.

View File

@ -79,13 +79,13 @@ bx_soundmod_ctl_c::~bx_soundmod_ctl_c()
void bx_soundmod_ctl_c::init()
{
bx_param_enum_c *driver = SIM->get_param_enum(BXPN_SOUND_DRIVER);
int ret;
const char *driver = SIM->get_param_string(BXPN_SOUND_DRIVER)->getptr();
const char *pwaveout = SIM->get_param_string(BXPN_SOUND_WAVEOUT)->getptr();
const char *wavein = SIM->get_param_string(BXPN_SOUND_WAVEIN)->getptr();
const char *pwavein = SIM->get_param_string(BXPN_SOUND_WAVEIN)->getptr();
if (get_driver(driver) != NULL) {
if (!strlen(wavein)) {
if (get_driver(driver->get()) != NULL) {
if (!strlen(pwavein)) {
SIM->get_param_string(BXPN_SOUND_WAVEIN)->set(pwaveout);
}
waveout = soundmod[0].module->get_waveout();
@ -95,22 +95,18 @@ void bx_soundmod_ctl_c::init()
BX_PANIC(("Could not open wave output device"));
}
} else {
BX_PANIC(("no waveout support in sound driver '%s'", driver));
BX_PANIC(("no waveout support in sound driver '%s'", driver->get_selected());
}
}
}
bx_sound_lowlevel_c* bx_soundmod_ctl_c::get_driver(const char *name)
bx_sound_lowlevel_c* bx_soundmod_ctl_c::get_driver(int driver_id)
{
static const char default_name[] = BX_SOUND_LOWLEVEL_NAME;
bx_sound_lowlevel_c *driver = NULL;
unsigned i;
if (strcmp(name, "default") == 0) {
name = default_name;
}
for (i = 0; i < n_sound_drivers; i++) {
if (!strcmp(name, soundmod[i].name)) {
if (driver_id == soundmod[i].drv_id)) {
return soundmod[i].module;
}
}
@ -118,36 +114,37 @@ bx_sound_lowlevel_c* bx_soundmod_ctl_c::get_driver(const char *name)
BX_PANIC(("Too many sound drivers!"));
return NULL;
}
if (strcmp(name, "dummy") == 0) {
if (driver_id == BX_SOUNDDRV_DUMMY) {
driver = new bx_sound_lowlevel_c();
} else if (!strcmp(name, "file")) {
} else if (driver_id == BX_SOUNDDRV_FILE) {
driver = new bx_sound_file_c();
#if BX_HAVE_ALSASOUND
} else if (!strcmp(name, "alsa")) {
} else if (driver_id == BX_SOUNDDRV_ALSA) {
driver = new bx_sound_alsa_c();
#endif
#if BX_WITH_SDL || BX_WITH_SDL2
} else if (!strcmp(name, "sdl")) {
} else if (driver_id == BX_SOUNDDRV_SDL) {
driver = new bx_sound_sdl_c();
#endif
#if (defined(linux) || defined(__FreeBSD__) || defined(__FreeBSD_kernel__))
} else if (!strcmp(name, "oss")) {
} else if (driver_id == BX_SOUNDDRV_OSS) {
driver = new bx_sound_oss_c();
#endif
#if defined(macintosh)
} else if (!strcmp(name, "osx")) {
} else if (driver_id == BX_SOUNDDRV_OSX) {
driver = new bx_sound_osx_c();
#endif
#if defined(WIN32)
} else if (!strcmp(name, "win")) {
} else if (driver_id == BX_SOUNDDRV_WIN) {
driver = new bx_sound_windows_c();
#endif
} else {
BX_PANIC(("unknown lowlevel sound driver '%s'", name));
BX_PANIC(("unknown lowlevel sound driver id %d", driver_id));
}
if (driver != NULL) {
BX_INFO(("Installed sound driver '%s' at index #%d", name, i));
strcpy(soundmod[i].name, name);
BX_INFO(("Installed sound driver '%s' at index #%d",
sound_driver_names[driver_id], i));
soundmod[i].drv_id = driver_id;
soundmod[i].module = driver;
n_sound_drivers++;
}
@ -160,8 +157,8 @@ bx_soundlow_waveout_c* bx_soundmod_ctl_c::get_waveout(const char *driver)
if (!strcmp(driver, "default")) {
module = soundmod[0].module;
} else {
module = get_driver(driver);
} else if (!strcmp(driver, "file")) {
module = get_driver(BX_SOUNDDRV_FILE);
}
if (module != NULL) {
return module->get_waveout();
@ -176,8 +173,6 @@ bx_soundlow_wavein_c* bx_soundmod_ctl_c::get_wavein(const char *driver)
if (!strcmp(driver, "default")) {
module = soundmod[0].module;
} else {
module = get_driver(driver);
}
if (module != NULL) {
return module->get_wavein();
@ -192,8 +187,8 @@ bx_soundlow_midiout_c* bx_soundmod_ctl_c::get_midiout(const char *driver)
if (!strcmp(driver, "default")) {
module = soundmod[0].module;
} else {
module = get_driver(driver);
} else if (!strcmp(driver, "file")) {
module = get_driver(BX_SOUNDDRV_FILE);
}
if (module != NULL) {
return module->get_midiout();

View File

@ -36,10 +36,10 @@ public:
virtual bx_soundlow_midiout_c* get_midiout(const char *driver);
private:
bx_sound_lowlevel_c* get_driver(const char *name);
bx_sound_lowlevel_c* get_driver(int driver_id);
struct {
char name[8];
int drv_id;
bx_sound_lowlevel_c *module;
} soundmod[BX_MAX_SOUND_DRIVERS];
unsigned n_sound_drivers;