we load settings on open(), changes are taken into account on media_server restarts

git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@27982 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
Jérôme Duval
2008-10-11 21:54:43 +00:00
parent 6a6efce864
commit 11f2701ecf
3 changed files with 72 additions and 69 deletions
@@ -24,7 +24,6 @@
#include <KernelExport.h>
#include <Drivers.h>
#include <driver_settings.h>
#include <unistd.h>
#include "OsSupportBeOS.h"
#include "EchoGalsXface.h"
@@ -74,14 +73,6 @@ int32 num_names;
char * names[NUM_CARDS*20+1];
#endif // CARDBUS
echo_settings current_settings = {
2, // channels
16, // bits per sample
48000, // sample rate
512, // buffer frames
2 // buffer count
};
extern device_hooks multi_hooks;
#ifdef MIDI_SUPPORT
extern device_hooks midi_hooks;
@@ -535,52 +526,6 @@ init_driver(void)
{
PRINT(("init_driver()\n"));
void *settings_handle;
// get driver settings
settings_handle = load_driver_settings ("echo.settings");
if (settings_handle != NULL) {
const char* item;
char* end;
uint32 value;
item = get_driver_parameter (settings_handle, "channels", NULL, NULL);
if (item) {
value = strtoul (item, &end, 0);
if (*end == '\0') current_settings.channels = value;
}
PRINT(("channels %lu\n", current_settings.channels));
item = get_driver_parameter (settings_handle, "bitsPerSample", NULL, NULL);
if (item) {
value = strtoul (item, &end, 0);
if (*end == '\0') current_settings.bitsPerSample = value;
}
PRINT(("bitsPerSample %lu\n", current_settings.bitsPerSample));
item = get_driver_parameter (settings_handle, "sample_rate", NULL, NULL);
if (item) {
value = strtoul (item, &end, 0);
if (*end == '\0') current_settings.sample_rate = value;
}
PRINT(("sample_rate %lu\n", current_settings.sample_rate));
item = get_driver_parameter (settings_handle, "buffer_frames", NULL, NULL);
if (item) {
value = strtoul (item, &end, 0);
if (*end == '\0') current_settings.buffer_frames = value;
}
PRINT(("buffer_frames %lu\n", current_settings.buffer_frames));
item = get_driver_parameter (settings_handle, "buffer_count", NULL, NULL);
if (item) {
value = strtoul (item, &end, 0);
if (*end == '\0') current_settings.buffer_count = value;
}
PRINT(("buffer_count %lu\n", current_settings.buffer_count));
unload_driver_settings (settings_handle);
}
#ifdef CARDBUS
// Get card services client module
if (get_module(CB_ENABLER_MODULE_NAME, (module_info **)&cbemi) != B_OK) {
@@ -39,16 +39,6 @@
#define DEVNAME 32
#define NUM_CARDS 3
typedef struct {
uint8 channels;
uint8 bitsPerSample;
uint32 sample_rate;
uint32 buffer_frames;
int32 buffer_count;
} echo_settings;
extern echo_settings current_settings;
/*
* Echo midi
*/
@@ -29,6 +29,7 @@
*
*/
#include <driver_settings.h>
#include <OS.h>
#include <MediaDefs.h>
#include "debug.h"
@@ -46,6 +47,22 @@ typedef enum {
B_MIX_NOMINAL = 1 << 2
} mixer_type;
typedef struct {
uint8 channels;
uint8 bitsPerSample;
uint32 sample_rate;
uint32 buffer_frames;
int32 buffer_count;
} echo_settings;
echo_settings current_settings = {
2, // channels
16, // bits per sample
48000, // sample rate
512, // buffer frames
2 // buffer count
};
static void
echo_channel_get_mix(void *card, MIXER_AUDIO_CHANNEL channel, int32 type, float *values) {
@@ -490,8 +507,8 @@ echo_get_description(echo_dev *card, multi_description *data)
data->interface_version = B_CURRENT_INTERFACE_VERSION;
data->interface_minimum = B_CURRENT_INTERFACE_VERSION;
strncpy(data->friendly_name, card->caps.szName, 32);
strcpy(data->vendor_info, AUTHOR);
strncpy(data->friendly_name, card->caps.szName, sizeof(data->friendly_name));
strncpy(data->vendor_info, AUTHOR, sizeof(data->vendor_info));
data->output_channel_count = card->multi.output_channel_count;
data->input_channel_count = card->multi.input_channel_count;
@@ -534,11 +551,12 @@ echo_get_description(echo_dev *card, multi_description *data)
data->interface_flags = B_MULTI_INTERFACE_PLAYBACK | B_MULTI_INTERFACE_RECORD;
data->start_latency = 3000;
strcpy(data->control_panel,"");
strcpy(data->control_panel, "");
return B_OK;
}
static status_t
echo_get_enabled_channels(echo_dev *card, multi_channel_enable *data)
{
@@ -556,6 +574,7 @@ echo_get_enabled_channels(echo_dev *card, multi_channel_enable *data)
return B_OK;
}
static status_t
echo_set_enabled_channels(echo_dev *card, multi_channel_enable *data)
{
@@ -566,6 +585,7 @@ echo_set_enabled_channels(echo_dev *card, multi_channel_enable *data)
return B_OK;
}
static status_t
echo_get_global_format(echo_dev *card, multi_format_info *data)
{
@@ -588,6 +608,7 @@ echo_get_global_format(echo_dev *card, multi_format_info *data)
return B_OK;
}
static status_t
echo_get_buffers(echo_dev *card, multi_buffer_list *data)
{
@@ -610,7 +631,6 @@ echo_get_buffers(echo_dev *card, multi_buffer_list *data)
ASSERT(current_settings.buffer_count == 2);
data->flags = B_MULTI_BUFFER_PLAYBACK | B_MULTI_BUFFER_RECORD; // XXX ???
// data->flags = 0;
data->return_playback_buffers = current_settings.buffer_count; /* playback_buffers[b][] */
data->return_playback_channels = 0; /* playback_buffers[][c] */
@@ -677,6 +697,7 @@ echo_play_inth(void* inthparams)
release_sem_etc(stream->card->buffer_ready_sem, 1, B_DO_NOT_RESCHEDULE);
}
void
echo_record_inth(void* inthparams)
{
@@ -698,6 +719,7 @@ echo_record_inth(void* inthparams)
release_sem_etc(stream->card->buffer_ready_sem, 1, B_DO_NOT_RESCHEDULE);
}
static status_t
echo_buffer_exchange(echo_dev *card, multi_buffer_info *data)
{
@@ -929,6 +951,52 @@ echo_open(const char *name, uint32 flags, void** cookie)
#ifdef CARDBUS
card->opened = true;
#endif
void *settings_handle;
// get driver settings
settings_handle = load_driver_settings ("echo.settings");
if (settings_handle != NULL) {
const char* item;
char* end;
uint32 value;
item = get_driver_parameter (settings_handle, "channels", NULL, NULL);
if (item) {
value = strtoul (item, &end, 0);
if (*end == '\0') current_settings.channels = value;
}
PRINT(("channels %u\n", current_settings.channels));
item = get_driver_parameter (settings_handle, "bitsPerSample", NULL, NULL);
if (item) {
value = strtoul (item, &end, 0);
if (*end == '\0') current_settings.bitsPerSample = value;
}
PRINT(("bitsPerSample %u\n", current_settings.bitsPerSample));
item = get_driver_parameter (settings_handle, "sample_rate", NULL, NULL);
if (item) {
value = strtoul (item, &end, 0);
if (*end == '\0') current_settings.sample_rate = value;
}
PRINT(("sample_rate %lu\n", current_settings.sample_rate));
item = get_driver_parameter (settings_handle, "buffer_frames", NULL, NULL);
if (item) {
value = strtoul (item, &end, 0);
if (*end == '\0') current_settings.buffer_frames = value;
}
PRINT(("buffer_frames %lu\n", current_settings.buffer_frames));
item = get_driver_parameter (settings_handle, "buffer_count", NULL, NULL);
if (item) {
value = strtoul (item, &end, 0);
if (*end == '\0') current_settings.buffer_count = value;
}
PRINT(("buffer_count %lu\n", current_settings.buffer_count));
unload_driver_settings (settings_handle);
}
LOG(("creating play streams\n"));