diff --git a/src/add-ons/kernel/drivers/audio/echo/echo.cpp b/src/add-ons/kernel/drivers/audio/echo/echo.cpp index 49c05f6642..a39ec67d64 100644 --- a/src/add-ons/kernel/drivers/audio/echo/echo.cpp +++ b/src/add-ons/kernel/drivers/audio/echo/echo.cpp @@ -24,6 +24,7 @@ #include #include +#include #include #include #include "OsSupportBeOS.h" @@ -75,6 +76,14 @@ 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; @@ -513,6 +522,40 @@ init_hardware(void) status_t init_driver(void) { + PRINT(("init_driver()\n")); + load_driver_symbols(DRIVER_NAME); + + 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", "0", "0"); + value = strtoul (item, &end, 0); + if (*end == '\0') current_settings.channels = value; + + item = get_driver_parameter (settings_handle, "bitsPerSample", "0", "0"); + value = strtoul (item, &end, 0); + if (*end == '\0') current_settings.bitsPerSample = value; + + item = get_driver_parameter (settings_handle, "sample_rate", "0", "0"); + value = strtoul (item, &end, 0); + if (*end == '\0') current_settings.sample_rate = value; + + item = get_driver_parameter (settings_handle, "buffer_frames", "0", "0"); + value = strtoul (item, &end, 0); + if (*end == '\0') current_settings.buffer_frames = value; + + item = get_driver_parameter (settings_handle, "buffer_count", "0", "0"); + value = strtoul (item, &end, 0); + if (*end == '\0') current_settings.buffer_count = value; + + unload_driver_settings (settings_handle); + } + #ifdef CARDBUS // Get card services client module if (get_module(CB_ENABLER_MODULE_NAME, (module_info **)&cbemi) != B_OK) { @@ -541,9 +584,6 @@ cb_error: pci_info info; num_cards = 0; - PRINT(("init_driver()\n")); - load_driver_symbols(DRIVER_NAME); - if (get_module(pci_name, (module_info **) &pci)) return ENOSYS; diff --git a/src/add-ons/kernel/drivers/audio/echo/echo.h b/src/add-ons/kernel/drivers/audio/echo/echo.h index bdf1029040..0ddacc3cfd 100644 --- a/src/add-ons/kernel/drivers/audio/echo/echo.h +++ b/src/add-ons/kernel/drivers/audio/echo/echo.h @@ -39,6 +39,15 @@ #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/echo.settings b/src/add-ons/kernel/drivers/audio/echo/echo.settings new file mode 100644 index 0000000000..3f11b85cd5 --- /dev/null +++ b/src/add-ons/kernel/drivers/audio/echo/echo.settings @@ -0,0 +1,11 @@ +# Settings file for the echo driver +# +# This file should be moved to the directory +# ~/config/settings/kernel/drivers/ +# + +#channels 2 +#bitsPerSample 16 +#sample_rate 48000 +#buffer_frames 512 +#buffer_count 2 diff --git a/src/add-ons/kernel/drivers/audio/echo/multi.cpp b/src/add-ons/kernel/drivers/audio/echo/multi.cpp index a9bf5a9d40..a4a94507d3 100644 --- a/src/add-ons/kernel/drivers/audio/echo/multi.cpp +++ b/src/add-ons/kernel/drivers/audio/echo/multi.cpp @@ -506,16 +506,21 @@ echo_get_description(echo_dev *card, multi_description *data) memcpy(data->channels, card->multi.chans, size * sizeof(card->multi.chans[0])); } - data->output_rates = B_SR_48000;// | B_SR_44100 | B_SR_CVSR; - data->input_rates = B_SR_48000;// | B_SR_44100 | B_SR_CVSR; - //data->output_rates = B_SR_44100; - //data->input_rates = B_SR_44100; + switch (current_settings.sample_rate) { + case 192000: data->output_rates = data->input_rates = B_SR_192000; break; + case 96000: data->output_rates = data->input_rates = B_SR_96000; break; + case 48000: data->output_rates = data->input_rates = B_SR_48000; break; + case 44100: data->output_rates = data->input_rates = B_SR_44100; break; + } data->min_cvsr_rate = 0; data->max_cvsr_rate = 48000; - //data->max_cvsr_rate = 44100; - data->output_formats = B_FMT_16BIT; - data->input_formats = B_FMT_16BIT; + switch (current_settings.bitsPerSample) { + case 8: data->output_formats = data->input_formats = B_FMT_8BIT_U; break; + case 16: data->output_formats = data->input_formats = B_FMT_16BIT; break; + case 24: data->output_formats = data->input_formats = B_FMT_24BIT; break; + case 32: data->output_formats = data->input_formats = B_FMT_32BIT; break; + } data->lock_sources = B_MULTI_LOCK_INTERNAL; data->timecode_sources = 0; data->interface_flags = B_MULTI_INTERFACE_PLAYBACK | B_MULTI_INTERFACE_RECORD; @@ -559,18 +564,19 @@ echo_get_global_format(echo_dev *card, multi_format_info *data) data->output_latency = 0; data->input_latency = 0; data->timecode_kind = 0; - data->input.rate = B_SR_48000; - data->input.cvsr = 48000; - data->input.format = B_FMT_16BIT; - data->output.rate = B_SR_48000; - data->output.cvsr = 48000; - data->output.format = B_FMT_16BIT; - /*data->input.rate = B_SR_44100; - data->input.cvsr = 44100; - data->input.format = B_FMT_16BIT; - data->output.rate = B_SR_44100; - data->output.cvsr = 44100; - data->output.format = B_FMT_16BIT;*/ + switch (current_settings.sample_rate) { + case 192000: data->output.rate = data->input.rate = B_SR_192000; break; + case 96000: data->output.rate = data->input.rate = B_SR_96000; break; + case 48000: data->output.rate = data->input.rate = B_SR_48000; break; + case 44100: data->output.rate = data->input.rate = B_SR_44100; break; + } + switch (current_settings.bitsPerSample) { + case 8: data->input.format = data->output.format = B_FMT_8BIT_U; break; + case 16: data->input.format = data->output.format = B_FMT_16BIT; break; + case 24: data->input.format = data->output.format = B_FMT_24BIT; break; + case 32: data->input.format = data->output.format = B_FMT_32BIT; break; + } + data->input.cvsr = data->output.cvsr = current_settings.sample_rate; return B_OK; } @@ -588,19 +594,19 @@ echo_get_buffers(echo_dev *card, multi_buffer_list *data) LOG(("request_record_channels = %#x\n",data->request_record_channels)); LOG(("request_record_buffer_size = %#x\n",data->request_record_buffer_size)); - if (data->request_playback_buffers < BUFFER_COUNT || - data->request_record_buffers < BUFFER_COUNT) { + if (data->request_playback_buffers < current_settings.buffer_count || + data->request_record_buffers < current_settings.buffer_count) { LOG(("not enough channels/buffers\n")); } - ASSERT(BUFFER_COUNT == 2); + ASSERT(current_settings.buffer_count == 2); data->flags = B_MULTI_BUFFER_PLAYBACK | B_MULTI_BUFFER_RECORD; // XXX ??? // data->flags = 0; - data->return_playback_buffers = BUFFER_COUNT; /* playback_buffers[b][] */ + data->return_playback_buffers = current_settings.buffer_count; /* playback_buffers[b][] */ data->return_playback_channels = 0; /* playback_buffers[][c] */ - data->return_playback_buffer_size = BUFFER_FRAMES; /* frames */ + data->return_playback_buffer_size = current_settings.buffer_frames; /* frames */ LIST_FOREACH(stream, &card->streams, next) { if ((stream->use & ECHO_USE_PLAY) == 0) @@ -611,16 +617,16 @@ echo_get_buffers(echo_dev *card, multi_buffer_list *data) if (data->request_playback_channels < data->return_playback_channels) { LOG(("not enough channels\n")); } - for(i=0; ichannels; j++) echo_stream_get_nth_buffer(stream, j, i, &data->playback_buffers[i][channels+j].base, &data->playback_buffers[i][channels+j].stride); } - data->return_record_buffers = BUFFER_COUNT; + data->return_record_buffers = current_settings.buffer_count; data->return_record_channels = 0; - data->return_record_buffer_size = BUFFER_FRAMES; /* frames */ + data->return_record_buffer_size = current_settings.buffer_frames; /* frames */ LIST_FOREACH(stream, &card->streams, next) { if ((stream->use & ECHO_USE_PLAY) != 0) @@ -631,7 +637,7 @@ echo_get_buffers(echo_dev *card, multi_buffer_list *data) if (data->request_record_channels < data->return_record_channels) { LOG(("not enough channels\n")); } - for(i=0; ichannels; j++) echo_stream_get_nth_buffer(stream, j, i, &data->record_buffers[i][channels+j].base, @@ -652,7 +658,7 @@ echo_play_inth(void* inthparams) acquire_spinlock(&slock); stream->real_time = system_time(); - stream->frames_count += BUFFER_FRAMES; + stream->frames_count += current_settings.buffer_frames; stream->buffer_cycle = (stream->trigblk + stream->blkmod) % stream->blkmod; stream->update_needed = true; @@ -673,7 +679,7 @@ echo_record_inth(void* inthparams) acquire_spinlock(&slock); stream->real_time = system_time(); - stream->frames_count += BUFFER_FRAMES; + stream->frames_count += current_settings.buffer_frames; stream->buffer_cycle = (stream->trigblk + stream->blkmod - 1) % stream->blkmod; stream->update_needed = true; @@ -914,10 +920,11 @@ echo_open(const char *name, uint32 flags, void** cookie) LOG(("creating play streams\n")); for (i=card->caps.wNumPipesOut - 2; i >=0 ; i-=2) { - stream = echo_stream_new(card, ECHO_USE_PLAY, BUFFER_FRAMES, BUFFER_COUNT); + stream = echo_stream_new(card, ECHO_USE_PLAY, current_settings.buffer_frames, current_settings.buffer_count); if (!card->pstream) card->pstream = stream; - echo_stream_set_audioparms(stream, 2, 16, 48000, i); + echo_stream_set_audioparms(stream, current_settings.channels, + current_settings.bitsPerSample, current_settings.sample_rate, i); stream->first_channel = i; } @@ -926,10 +933,11 @@ echo_open(const char *name, uint32 flags, void** cookie) LOG(("creating record streams\n")); for (i=card->caps.wNumPipesIn - 2; i >= 0; i-=2) { - stream = echo_stream_new(card, ECHO_USE_RECORD, BUFFER_FRAMES, BUFFER_COUNT); + stream = echo_stream_new(card, ECHO_USE_RECORD, current_settings.buffer_frames, current_settings.buffer_count); if (!card->rstream) card->rstream = stream; - echo_stream_set_audioparms(stream, 2, 16, 48000, i); + echo_stream_set_audioparms(stream, current_settings.channels, + current_settings.bitsPerSample, current_settings.sample_rate, i); stream->first_channel = i + first_record_channel; } diff --git a/src/add-ons/kernel/drivers/audio/echo/multi.h b/src/add-ons/kernel/drivers/audio/echo/multi.h index 6d6499b7c9..935cc63c15 100644 --- a/src/add-ons/kernel/drivers/audio/echo/multi.h +++ b/src/add-ons/kernel/drivers/audio/echo/multi.h @@ -34,9 +34,6 @@ #include "OsSupportBeOS.h" #include "MixerXface.h" -#define BUFFER_FRAMES 512 -#define BUFFER_COUNT 2 - typedef struct _multi_mixer_control { struct _multi_dev *multi; void (*get) (void *card, MIXER_AUDIO_CHANNEL, int32 type, float *values);