From 11f2701ecfbde84687e4e534b9b7dbb857263ffc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=B4me=20Duval?= Date: Sat, 11 Oct 2008 21:54:43 +0000 Subject: [PATCH] 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 --- .../kernel/drivers/audio/echo/echo.cpp | 55 -------------- src/add-ons/kernel/drivers/audio/echo/echo.h | 10 --- .../kernel/drivers/audio/echo/multi.cpp | 76 ++++++++++++++++++- 3 files changed, 72 insertions(+), 69 deletions(-) diff --git a/src/add-ons/kernel/drivers/audio/echo/echo.cpp b/src/add-ons/kernel/drivers/audio/echo/echo.cpp index 509119b406..9bf4378948 100644 --- a/src/add-ons/kernel/drivers/audio/echo/echo.cpp +++ b/src/add-ons/kernel/drivers/audio/echo/echo.cpp @@ -24,7 +24,6 @@ #include #include -#include #include #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) { diff --git a/src/add-ons/kernel/drivers/audio/echo/echo.h b/src/add-ons/kernel/drivers/audio/echo/echo.h index 934bcf5801..6ab19608ce 100644 --- a/src/add-ons/kernel/drivers/audio/echo/echo.h +++ b/src/add-ons/kernel/drivers/audio/echo/echo.h @@ -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 */ diff --git a/src/add-ons/kernel/drivers/audio/echo/multi.cpp b/src/add-ons/kernel/drivers/audio/echo/multi.cpp index 860553a077..5d227074d5 100644 --- a/src/add-ons/kernel/drivers/audio/echo/multi.cpp +++ b/src/add-ons/kernel/drivers/audio/echo/multi.cpp @@ -29,6 +29,7 @@ * */ +#include #include #include #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"));