diff --git a/src/add-ons/kernel/drivers/audio/ice1712/ice1712.c b/src/add-ons/kernel/drivers/audio/ice1712/ice1712.c index 14f8899109..9f263a8a18 100644 --- a/src/add-ons/kernel/drivers/audio/ice1712/ice1712.c +++ b/src/add-ons/kernel/drivers/audio/ice1712/ice1712.c @@ -18,6 +18,7 @@ #include #include #include +#include #include "ice1712.h" #include "ice1712_reg.h" @@ -26,21 +27,15 @@ #include "util.h" #include "debug.h" -//------------------------------------------------------ -//------------------------------------------------------ status_t init_hardware(void); status_t init_driver(void); void uninit_driver(void); const char **publish_devices(void); device_hooks *find_device(const char *); - -//------------------------------------------------------ - +status_t load_settings(ice1712 *card); int32 ice_1712_int(void *arg); -//------------------------------------------------------ - pci_module_info *pci; generic_mpu401_module *mpu401; @@ -48,25 +43,10 @@ int32 num_cards = 0; ice1712 cards[NUM_CARDS]; int32 num_names = 0; char *names[NUM_CARDS*20+1]; - -//------------------------------------------------------ -//------------------------------------------------------ - int32 api_version = B_CUR_DRIVER_API_VERSION; #define HMULTI_AUDIO_DEV_PATH "audio/hmulti/ice1712" -//#define HMULTI_AUDIO_DEV_PATH "audio/multi/ice1712" -//------------------------------------------------------ -//------------------------------------------------------ - -//void republish_devices(void); - -//extern image_id load_kernel_addon(const char *path); -//extern status_t unload_kernel_addon(image_id imid); - -//------------------------------------------------------ -//------------------------------------------------------ status_t init_hardware(void) @@ -348,7 +328,7 @@ ice1712_setup(ice1712 *ice) ice->sampling_rate = 0x08; ice->buffer = 0; ice->frames_count = 0; - ice->buffer_size = MAX_BUFFER_FRAMES; + ice->buffer_size = ice->settings.bufferSize; ice->total_output_channels = ice->config.nb_DAC; if (ice->config.spdif & SPDIF_OUT_PRESENT) @@ -440,6 +420,9 @@ init_driver(void) cards[num_cards].info.function, strerror(err)); continue; } + + load_settings(&cards[num_cards]); + if (ice1712_setup(&cards[num_cards]) != B_OK) { //Vendor_ID and Device_ID has been modified TRACE("Setup of ice1712 %d failed\n", (int)(num_cards + 1)); @@ -502,7 +485,6 @@ uninit_driver(void) put_module(B_PCI_MODULE_NAME); } -//------------------------------------------------------ const char ** publish_devices(void) @@ -732,10 +714,39 @@ find_device(const char * name) return NULL; } -//----------------------------------------------------------------------------- +status_t +load_settings(ice1712 *card) +{ + // get driver settings + void *settings_handle = load_driver_settings("ice1712.settings"); + + //Use a large enough value for modern computer + card->settings.bufferSize = 512; + + if (settings_handle != NULL) { + const char *item; + char *end; + + item = get_driver_parameter(settings_handle, "buffer_size", + "512", "512"); + if (item) { + uint32 value = strtoul(item, &end, 0); + if ((*end == '\0') + && (value >= MIN_BUFFER_FRAMES) + && (value <= MAX_BUFFER_FRAMES)) { + card->settings.bufferSize = value; + } + } + + unload_driver_settings(settings_handle); + } + + return B_OK; +} + status_t -applySettings(ice1712 *card) +apply_settings(ice1712 *card) { int i; uint16 val, mt30 = 0; @@ -810,7 +821,7 @@ applySettings(ice1712 *card) } write_mt_uint16(card, MT_ROUTING_CONTROL_PSDOUT, mt30); write_mt_uint32(card, MT_CAPTURED_DATA, mt34); - + //Digital output if ((card->config.spdif & SPDIF_OUT_PRESENT) != 0) { uint16 mt32 = 0; @@ -836,6 +847,6 @@ applySettings(ice1712 *card) write_mt_uint16(card, MT_ROUTING_CONTROL_SPDOUT, mt32); } - + return B_OK; } diff --git a/src/add-ons/kernel/drivers/audio/ice1712/ice1712.h b/src/add-ons/kernel/drivers/audio/ice1712/ice1712.h index 40ef886c60..72122556ff 100644 --- a/src/add-ons/kernel/drivers/audio/ice1712/ice1712.h +++ b/src/add-ons/kernel/drivers/audio/ice1712/ice1712.h @@ -16,7 +16,7 @@ #include "hmulti_audio.h" #define DRIVER_NAME "ice1712" -#define VERSION "0.4" +#define VERSION "0.5" #define ICE1712_VENDOR_ID 0x1412 #define ICE1712_DEVICE_ID 0x1712 @@ -104,10 +104,10 @@ typedef struct ice1712_settings channel_volume playback[ICE1712_HARDWARE_VOLUME]; channel_volume record[ICE1712_HARDWARE_VOLUME]; + uint32 bufferSize; + //General Settings uint8 clock; //an index - uint8 bufferSize; //an index - uint8 debugMode; //an index for debugging //S/PDif Settings uint8 outFormat; //an index @@ -173,7 +173,7 @@ typedef struct ice1712 ice1712_settings settings; } ice1712; -status_t applySettings(ice1712 *card); +status_t apply_settings(ice1712 *card); //For midi.c extern int32 num_cards; diff --git a/src/add-ons/kernel/drivers/audio/ice1712/ice1712.settings b/src/add-ons/kernel/drivers/audio/ice1712/ice1712.settings new file mode 100644 index 0000000000..bddb2468ed --- /dev/null +++ b/src/add-ons/kernel/drivers/audio/ice1712/ice1712.settings @@ -0,0 +1,2 @@ +#Ice1712 settings file +buffer_size 128 diff --git a/src/add-ons/kernel/drivers/audio/ice1712/multi.c b/src/add-ons/kernel/drivers/audio/ice1712/multi.c index 653bedae86..bf17e4a523 100644 --- a/src/add-ons/kernel/drivers/audio/ice1712/multi.c +++ b/src/add-ons/kernel/drivers/audio/ice1712/multi.c @@ -21,7 +21,7 @@ #define AUTHORIZED_RATE (B_SR_SAME_AS_INPUT | B_SR_96000 \ | B_SR_88200 | B_SR_48000 | B_SR_44100) -#define AUTHORIZED_SAMPLE_SIZE (B_FMT_32BIT) +#define AUTHORIZED_SAMPLE_SIZE (B_FMT_24BIT) #define MAX_CONTROL 32 @@ -381,18 +381,14 @@ get_combo_cb(ice1712 *card, uint32 index) break; case 1: - value = card->settings.bufferSize; - break; - - case 2: value = card->settings.outFormat; break; - case 3: + case 2: value = card->settings.emphasis; break; - case 4: + case 3: value = card->settings.copyMode; break; } @@ -413,25 +409,16 @@ set_combo_cb(ice1712 *card, uint32 index, uint32 value) break; case 1: - if (value < 6) { - card->settings.bufferSize = value; -// card->buffer_size = 64 * (1 << value); -// ice1712_buffer_force_stop(card); -// start_DMA(card); - } - break; - - case 2: if (value < 2) card->settings.outFormat = value; break; - case 3: + case 2: if (value < 3) card->settings.emphasis = value; break; - case 4: + case 3: if (value < 3) card->settings.copyMode = value; break; @@ -601,7 +588,7 @@ ice1712_set_mix(ice1712 *card, multi_mix_value_info *data) } } - return applySettings(card); + return apply_settings(card); } @@ -618,16 +605,6 @@ static const char *Clock[] = { NULL, }; -static const char *BufferSize[] = { - "64", - "128", - "256", - "512", - "1024", - "2048", - NULL, -}; - static const char *DigitalFormat[] = { "Consumer", "Professional", @@ -650,7 +627,6 @@ static const char *DigitalCopyMode[] = { static const char **SettingsGeneral[] = { Clock, - BufferSize, NULL, }; @@ -671,8 +647,8 @@ static const char *string_list[] = { //General settings "Master clock", - "Buffer size", - "Debug", + "reserved_0", + "reserved_1", //Digital settings "Output format",