git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@34005 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
Jérôme Duval
2009-11-11 20:06:28 +00:00
parent e629da4a47
commit 79cc4374cf
+113 -115
View File
@@ -17,8 +17,9 @@
#include <string.h>
#define AUTORIZED_RATE (B_SR_SAME_AS_INPUT | B_SR_IS_GLOBAL | B_SR_96000 | B_SR_88200 | B_SR_48000 | B_SR_44100)
#define AUTORIZED_SAMPLE_SIZE (B_FMT_32BIT)
#define AUTHORIZED_RATE (B_SR_SAME_AS_INPUT | B_SR_IS_GLOBAL | B_SR_96000 \
| B_SR_88200 | B_SR_48000 | B_SR_44100)
#define AUTHORIZED_SAMPLE_SIZE (B_FMT_32BIT)
static void
start_DMA(ice1712 *card)
@@ -42,8 +43,8 @@ start_DMA(ice1712 *card)
TRACE_ICE(("SIZE DMA RECORD %#x\n", size));
//Enable output AND Input from Analog CODEC
switch (card->product)
{//TODO: find correct value for all card
switch (card->product) {
//TODO: find correct value for all card
case ICE1712_SUBDEVICE_DELTA66:
case ICE1712_SUBDEVICE_DELTA44:
case ICE1712_SUBDEVICE_AUDIOPHILE_2496:
@@ -61,8 +62,8 @@ start_DMA(ice1712 *card)
}
//Set Data Format for SPDif codec
switch (card->product)
{//TODO: find correct value for all card
switch (card->product) {
//TODO: find correct value for all card
case ICE1712_SUBDEVICE_DELTA1010:
break;
case ICE1712_SUBDEVICE_DELTADIO2496:
@@ -104,8 +105,7 @@ ice1712_get_description(ice1712 *card, multi_description *data)
data->interface_version = B_CURRENT_INTERFACE_VERSION;
data->interface_minimum = B_CURRENT_INTERFACE_VERSION;
switch (card->product)
{
switch (card->product) {
case ICE1712_SUBDEVICE_DELTA1010:
strncpy(data->friendly_name, "Delta 1010", 32);
break;
@@ -130,7 +130,6 @@ ice1712_get_description(ice1712 *card, multi_description *data)
case ICE1712_SUBDEVICE_VX442:
strncpy(data->friendly_name, "VX 442", 32);
break;
default:
strncpy(data->friendly_name, "Unknow Device", 32);
break;
@@ -140,45 +139,45 @@ ice1712_get_description(ice1712 *card, multi_description *data)
data->output_channel_count = card->total_output_channels;
data->input_channel_count = card->total_input_channels;
data->output_bus_channel_count = 0;
data->input_bus_channel_count = 0;
data->output_bus_channel_count = card->total_output_channels;
data->input_bus_channel_count = card->total_input_channels;
data->aux_bus_channel_count = 0;
TRACE_ICE(("request_channel_count = %d\n", data->request_channel_count));
if (data->request_channel_count >= (card->total_output_channels + card->total_input_channels)) {
if (data->request_channel_count >= (card->total_output_channels
+ card->total_input_channels)) {
for (i = 0; i < card->nb_DAC; i++) {
//Analog STEREO output
data->channels[chan].channel_id = chan;
data->channels[chan].kind = B_MULTI_OUTPUT_CHANNEL;
data->channels[chan].designations = B_CHANNEL_STEREO_BUS | \
((i & 1) == 0) ? B_CHANNEL_LEFT : B_CHANNEL_RIGHT;
data->channels[chan].connectors = 0;
chan++;
data->channels[chan].designations = B_CHANNEL_STEREO_BUS
| ((i & 1) == 0) ? B_CHANNEL_LEFT : B_CHANNEL_RIGHT;
data->channels[chan++].connectors = 0;
}
if (card->spdif_config & NO_IN_YES_OUT) {
//SPDIF STEREO output
data->channels[chan].channel_id = chan;
data->channels[chan].kind = B_MULTI_OUTPUT_CHANNEL;
data->channels[chan].designations = B_CHANNEL_STEREO_BUS | B_CHANNEL_LEFT;
data->channels[chan].designations = B_CHANNEL_STEREO_BUS
| B_CHANNEL_LEFT;
data->channels[chan].connectors = 0;
chan++;
data->channels[chan].channel_id = chan;
data->channels[chan].kind = B_MULTI_OUTPUT_CHANNEL;
data->channels[chan].designations = B_CHANNEL_STEREO_BUS | B_CHANNEL_RIGHT;
data->channels[chan].connectors = 0;
chan++;
data->channels[chan].designations = B_CHANNEL_STEREO_BUS
| B_CHANNEL_RIGHT;
data->channels[chan++].connectors = 0;
}
for (i = 0; i < card->nb_ADC; i++) {
//Analog STEREO input
data->channels[chan].channel_id = chan;
data->channels[chan].kind = B_MULTI_INPUT_CHANNEL;
data->channels[chan].designations = B_CHANNEL_STEREO_BUS | \
data->channels[chan].designations = B_CHANNEL_STEREO_BUS |
((i & 1) == 0) ? B_CHANNEL_LEFT : B_CHANNEL_RIGHT;
data->channels[chan].connectors = 0;
chan++;
data->channels[chan++].connectors = 0;
}
if (card->spdif_config & YES_IN_NO_OUT) {
@@ -186,26 +185,22 @@ ice1712_get_description(ice1712 *card, multi_description *data)
data->channels[chan].channel_id = chan;
data->channels[chan].kind = B_MULTI_INPUT_CHANNEL;
data->channels[chan].designations = B_CHANNEL_STEREO_BUS | B_CHANNEL_LEFT;
data->channels[chan].connectors = 0;
chan++;
data->channels[chan++].connectors = 0;
data->channels[chan].channel_id = chan;
data->channels[chan].kind = B_MULTI_INPUT_CHANNEL;
data->channels[chan].designations = B_CHANNEL_STEREO_BUS | B_CHANNEL_RIGHT;
data->channels[chan].connectors = 0;
chan++;
data->channels[chan++].connectors = 0;
}
//The digital mixer output
data->channels[chan].channel_id = chan;
data->channels[chan].kind = B_MULTI_INPUT_CHANNEL;
data->channels[chan].designations = B_CHANNEL_STEREO_BUS | B_CHANNEL_LEFT;
data->channels[chan].connectors = 0;
chan++;
data->channels[chan++].connectors = 0;
data->channels[chan].channel_id = chan;
data->channels[chan].kind = B_MULTI_INPUT_CHANNEL;
data->channels[chan].designations = B_CHANNEL_STEREO_BUS | B_CHANNEL_RIGHT;
data->channels[chan].connectors = 0;
chan++;
data->channels[chan++].connectors = 0;
}
TRACE_ICE(("output_channel_count = %d\n", data->output_channel_count));
@@ -213,11 +208,11 @@ ice1712_get_description(ice1712 *card, multi_description *data)
TRACE_ICE(("output_bus_channel_count = %d\n", data->output_bus_channel_count));
TRACE_ICE(("input_bus_channel_count = %d\n", data->input_bus_channel_count));
data->output_rates = data->input_rates = AUTORIZED_RATE;
data->output_rates = data->input_rates = AUTHORIZED_RATE;
data->min_cvsr_rate = 44100;
data->max_cvsr_rate = 96000;
data->output_formats = data->input_formats = AUTORIZED_SAMPLE_SIZE;
data->output_formats = data->input_formats = AUTHORIZED_SAMPLE_SIZE;
data->lock_sources = B_MULTI_LOCK_INTERNAL | B_MULTI_LOCK_SPDIF;
data->timecode_sources = 0;
data->interface_flags = B_MULTI_INTERFACE_PLAYBACK | B_MULTI_INTERFACE_RECORD;
@@ -253,7 +248,8 @@ ice1712_set_enabled_channels(ice1712 *card, multi_channel_enable *data)
{
int i;
for (i = 0; i < (card->total_output_channels + card->total_input_channels); i++)
TRACE_ICE(("set_enabled_channels %d : %s\n", i, B_TEST_CHANNEL(data->enable_bits, i) ? "enabled": "disabled"));
TRACE_ICE(("set_enabled_channels %d : %s\n", i,
B_TEST_CHANNEL(data->enable_bits, i) ? "enabled": "disabled"));
TRACE_ICE(("lock_source %d\n", data->lock_source));
TRACE_ICE(("lock_data %d\n", data->lock_data));
@@ -278,28 +274,21 @@ ice1712_get_global_format(ice1712 *card, multi_format_info *data)
{
case 0x0:
data->input.rate = data->output.rate = B_SR_48000;
data->input.cvsr = data->output.cvsr = 48000.0f;
break;
case 0x7:
data->input.rate = data->output.rate = B_SR_96000;
data->input.cvsr = data->output.cvsr = 96000.0f;
break;
case 0x8:
data->input.rate = data->output.rate = B_SR_44100;
data->input.cvsr = data->output.cvsr = 44100.0f;
break;
case 0xB:
data->input.rate = data->output.rate = B_SR_88200;
data->input.cvsr = data->output.cvsr = 88200.0f;
break;
}
data->timecode_kind = 0;
data->output_latency = data->input_latency = 0;
data->output.format = data->input.format = AUTORIZED_SAMPLE_SIZE;
TRACE_ICE(("Input Sampling Rate = %d\n", (int)data->input.cvsr));
TRACE_ICE(("Output Sampling Rate = %d\n", (int)data->output.cvsr));
data->output.format = data->input.format = AUTHORIZED_SAMPLE_SIZE;
return B_OK;
}
@@ -315,8 +304,7 @@ ice1712_set_global_format(ice1712 *card, multi_format_info *data)
if ((data->input.rate == data->output.rate)
&& (card->lock_source == B_MULTI_LOCK_INTERNAL)) {
switch (data->input.rate)
{
switch (data->input.rate) {
case B_SR_96000:
card->sampling_rate = 0x07;
break;
@@ -375,7 +363,8 @@ ice1712_list_mix_channels(ice1712 *card, multi_mix_channel_info *data)
#endif
static int32
create_group_control(multi_mix_control *multi, int32 idx, int32 parent, int32 string, const char* name)
create_group_control(multi_mix_control *multi, int32 idx, int32 parent,
int32 string, const char* name)
{
multi->id = MULTI_AUDIO_BASE_ID + idx;
multi->master = parent;
@@ -390,7 +379,8 @@ create_group_control(multi_mix_control *multi, int32 idx, int32 parent, int32 st
}
static int32
create_slider_control(multi_mix_control *multi, int32 idx, int32 parent, int32 string, const char* name)
create_slider_control(multi_mix_control *multi, int32 idx, int32 parent,
int32 string, const char* name)
{
multi->id = MULTI_AUDIO_BASE_ID + idx;
multi->master = parent;
@@ -416,10 +406,12 @@ ice1712_list_mix_controls(ice1712 *card, multi_mix_control_info *data)
TRACE_ICE(("count = %d\n", data->control_count));
parent = create_group_control(data->controls + 0, 0, 0, S_null, "Playback");
create_slider_control (data->controls + 1, 1, parent, S_STEREO_MIX, "Master Output");
create_slider_control(data->controls + 1, 1, parent, S_STEREO_MIX,
"Master Output");
parent = create_group_control(data->controls + 2, 2, 0, S_null, "Record");
create_slider_control (data->controls + 3, 3, parent, S_STEREO_MIX, "Master Input");
create_slider_control(data->controls + 3, 3, parent, S_STEREO_MIX,
"Master Input");
data->control_count = 4;
return B_OK;
@@ -439,24 +431,31 @@ ice1712_get_buffers(ice1712 *card, multi_buffer_list *data)
int buff, chan_i = 0, chan_o = 0;
TRACE_ICE(("flags = %#x\n",data->flags));
TRACE_ICE(("request_playback_buffers = %#x\n", data->request_playback_buffers));
TRACE_ICE(("request_playback_channels = %#x\n", data->request_playback_channels));
TRACE_ICE(("request_playback_buffer_size = %#x\n", data->request_playback_buffer_size));
TRACE_ICE(("request_record_buffers = %#x\n", data->request_record_buffers));
TRACE_ICE(("request_record_channels = %#x\n", data->request_record_channels));
TRACE_ICE(("request_record_buffer_size = %#x\n", data->request_record_buffer_size));
TRACE_ICE(("request_playback_buffers = %#x\n",
data->request_playback_buffers));
TRACE_ICE(("request_playback_channels = %#x\n",
data->request_playback_channels));
TRACE_ICE(("request_playback_buffer_size = %#x\n",
data->request_playback_buffer_size));
TRACE_ICE(("request_record_buffers = %#x\n",
data->request_record_buffers));
TRACE_ICE(("request_record_channels = %#x\n",
data->request_record_channels));
TRACE_ICE(("request_record_buffer_size = %#x\n",
data->request_record_buffer_size));
// MIN_BUFFER_FRAMES <= requested value <= MAX_BUFFER_FRAMES
card->output_buffer_size = data->request_playback_buffer_size <= MAX_BUFFER_FRAMES ? \
data->request_playback_buffer_size >= MIN_BUFFER_FRAMES ? \
data->request_playback_buffer_size : MIN_BUFFER_FRAMES \
: MAX_BUFFER_FRAMES;
card->output_buffer_size = data->request_playback_buffer_size;
if (card->output_buffer_size > MAX_BUFFER_FRAMES)
card->output_buffer_size = MAX_BUFFER_FRAMES;
if (card->output_buffer_size < MIN_BUFFER_FRAMES)
card->output_buffer_size = MIN_BUFFER_FRAMES;
// MIN_BUFFER_FRAMES <= requested value <= MAX_BUFFER_FRAMES
card->input_buffer_size = data->request_record_buffer_size <= MAX_BUFFER_FRAMES ? \
data->request_record_buffer_size >= MIN_BUFFER_FRAMES ? \
data->request_record_buffer_size : MIN_BUFFER_FRAMES \
: MAX_BUFFER_FRAMES;
card->input_buffer_size = data->request_record_buffer_size;
if (card->input_buffer_size > MAX_BUFFER_FRAMES)
card->input_buffer_size = MAX_BUFFER_FRAMES;
if (card->input_buffer_size < MIN_BUFFER_FRAMES)
card->input_buffer_size = MIN_BUFFER_FRAMES;
for (buff = 0; buff < SWAPPING_BUFFERS; buff++) {
uint32 stride_o = MAX_DAC * SAMPLE_SIZE;
@@ -467,30 +466,27 @@ ice1712_get_buffers(ice1712 *card, multi_buffer_list *data)
if (data->request_playback_channels == card->total_output_channels) {
for (chan_o = 0; chan_o < card->nb_DAC; chan_o++) {
//Analog STEREO output
data->playback_buffers[buff][chan_o].base = card->log_addr_pb + \
buf_o * buff + \
SAMPLE_SIZE * chan_o;
data->playback_buffers[buff][chan_o].base = card->log_addr_pb
+ buf_o * buff + SAMPLE_SIZE * chan_o;
data->playback_buffers[buff][chan_o].stride = stride_o;
TRACE_ICE(("pb_buffer[%d][%d] = %#x\n", \
buff, chan_o, data->playback_buffers[buff][chan_o].base));
TRACE_ICE(("pb_buffer[%d][%d] = %#x\n", buff, chan_o,
data->playback_buffers[buff][chan_o].base));
}
if (card->spdif_config & NO_IN_YES_OUT) {
//SPDIF STEREO output
data->playback_buffers[buff][chan_o].base = card->log_addr_pb + \
buf_o * buff + \
SAMPLE_SIZE * SPDIF_LEFT;
data->playback_buffers[buff][chan_o].base = card->log_addr_pb
+ buf_o * buff + SAMPLE_SIZE * SPDIF_LEFT;
data->playback_buffers[buff][chan_o].stride = stride_o;
TRACE_ICE(("pb_buffer[%d][%d] = %#x\n", \
buff, chan_o, data->playback_buffers[buff][chan_o].base));
TRACE_ICE(("pb_buffer[%d][%d] = %#x\n", buff, chan_o,
data->playback_buffers[buff][chan_o].base));
chan_o++;
data->playback_buffers[buff][chan_o].base = card->log_addr_pb + \
buf_o * buff + \
SAMPLE_SIZE * SPDIF_RIGHT;
data->playback_buffers[buff][chan_o].base = card->log_addr_pb
+ buf_o * buff + SAMPLE_SIZE * SPDIF_RIGHT;
data->playback_buffers[buff][chan_o].stride = stride_o;
TRACE_ICE(("pb_buffer[%d][%d] = %#x\n", \
buff, chan_o, data->playback_buffers[buff][chan_o].base));
TRACE_ICE(("pb_buffer[%d][%d] = %#x\n", buff, chan_o,
data->playback_buffers[buff][chan_o].base));
chan_o++;
}
}
@@ -498,48 +494,43 @@ ice1712_get_buffers(ice1712 *card, multi_buffer_list *data)
if (data->request_record_channels == card->total_input_channels) {
for (chan_i = 0; chan_i < card->nb_ADC; chan_i++) {
//Analog STEREO input
data->record_buffers[buff][chan_i].base = card->log_addr_rec + \
buf_i * buff + \
SAMPLE_SIZE * chan_i;
data->record_buffers[buff][chan_i].base = card->log_addr_rec
+ buf_i * buff + SAMPLE_SIZE * chan_i;
data->record_buffers[buff][chan_i].stride = stride_i;
TRACE_ICE(("rec_buffer[%d][%d] = %#x\n", \
buff, chan_i, data->record_buffers[buff][chan_i].base));
TRACE_ICE(("rec_buffer[%d][%d] = %#x\n", buff, chan_i,
data->record_buffers[buff][chan_i].base));
}
if (card->spdif_config & YES_IN_NO_OUT) {
//SPDIF STEREO input
data->record_buffers[buff][chan_i].base = card->log_addr_rec + \
buf_i * buff + \
SAMPLE_SIZE * SPDIF_LEFT;
data->record_buffers[buff][chan_i].base = card->log_addr_rec
+ buf_i * buff + SAMPLE_SIZE * SPDIF_LEFT;
data->record_buffers[buff][chan_i].stride = stride_i;
TRACE_ICE(("rec_buffer[%d][%d] = %#x\n", \
buff, chan_i, data->record_buffers[buff][chan_i].base));
TRACE_ICE(("rec_buffer[%d][%d] = %#x\n", buff, chan_i,
data->record_buffers[buff][chan_i].base));
chan_i++;
data->record_buffers[buff][chan_i].base = card->log_addr_rec + \
buf_i * buff + \
SAMPLE_SIZE * SPDIF_RIGHT;
data->record_buffers[buff][chan_i].base = card->log_addr_rec
+ buf_i * buff + SAMPLE_SIZE * SPDIF_RIGHT;
data->record_buffers[buff][chan_i].stride = stride_i;
TRACE_ICE(("rec_buffer[%d][%d] = %#x\n", \
buff, chan_i, data->record_buffers[buff][chan_i].base));
TRACE_ICE(("rec_buffer[%d][%d] = %#x\n", buff, chan_i,
data->record_buffers[buff][chan_i].base));
chan_i++;
}
//The digital mixer output
data->record_buffers[buff][chan_i].base = card->log_addr_rec + \
buf_i * buff + \
SAMPLE_SIZE * MIXER_OUT_LEFT;
data->record_buffers[buff][chan_i].base = card->log_addr_rec
+ buf_i * buff + SAMPLE_SIZE * MIXER_OUT_LEFT;
data->record_buffers[buff][chan_i].stride = stride_i;
TRACE_ICE(("rec_buffer[%d][%d] = %#x\n", \
buff, chan_i, data->record_buffers[buff][chan_i].base));
TRACE_ICE(("rec_buffer[%d][%d] = %#x\n", buff, chan_i,
data->record_buffers[buff][chan_i].base));
chan_i++;
data->record_buffers[buff][chan_i].base = card->log_addr_rec + \
buf_i * buff + \
SAMPLE_SIZE * MIXER_OUT_RIGHT;
data->record_buffers[buff][chan_i].base = card->log_addr_rec
+ buf_i * buff + SAMPLE_SIZE * MIXER_OUT_RIGHT;
data->record_buffers[buff][chan_i].stride = stride_i;
TRACE_ICE(("rec_buffer[%d][%d] = %#x\n", \
buff, chan_i, data->record_buffers[buff][chan_i].base));
TRACE_ICE(("rec_buffer[%d][%d] = %#x\n", buff, chan_i,
data->record_buffers[buff][chan_i].base));
chan_i++;
}
}
@@ -548,18 +539,24 @@ ice1712_get_buffers(ice1712 *card, multi_buffer_list *data)
data->return_playback_channels = card->total_output_channels;
data->return_playback_buffer_size = card->output_buffer_size;
TRACE_ICE(("return_playback_buffers = %#x\n", data->return_playback_buffers));
TRACE_ICE(("return_playback_channels = %#x\n", data->return_playback_channels));
TRACE_ICE(("return_playback_buffer_size = %#x\n", data->return_playback_buffer_size));
TRACE_ICE(("return_playback_buffers = %#x\n",
data->return_playback_buffers));
TRACE_ICE(("return_playback_channels = %#x\n",
data->return_playback_channels));
TRACE_ICE(("return_playback_buffer_size = %#x\n",
data->return_playback_buffer_size));
data->return_record_buffers = SWAPPING_BUFFERS;
data->return_record_channels = card->total_input_channels;
data->return_record_channels = chan_i;
data->return_record_buffer_size = card->input_buffer_size;
TRACE_ICE(("return_record_buffers = %#x\n", data->return_record_buffers));
TRACE_ICE(("return_record_channels = %#x\n", data->return_record_channels));
TRACE_ICE(("return_record_buffer_size = %#x\n", data->return_record_buffer_size));
TRACE_ICE(("return_record_buffers = %#x\n",
data->return_record_buffers));
TRACE_ICE(("return_record_channels = %#x\n",
data->return_record_channels));
TRACE_ICE(("return_record_buffer_size = %#x\n",
data->return_record_buffer_size));
start_DMA(card);
@@ -574,12 +571,13 @@ ice1712_buffer_exchange(ice1712 *card, multi_buffer_info *data)
/* unsigned char peak[MAX_ADC];
int i;
*/
// TRACE_ICE(("Avant Exchange p : %d, r : %d\n", data->playback_buffer_cycle, data->record_buffer_cycle));
// TRACE_ICE(("Avant Exchange p : %d, r : %d\n", data->playback_buffer_cycle,
// data->record_buffer_cycle));
status = acquire_sem_etc(card->buffer_ready_sem, 1, B_RELATIVE_TIMEOUT | B_CAN_INTERRUPT, 50000);
switch (status)
{
case B_NO_ERROR :
status = acquire_sem_etc(card->buffer_ready_sem, 1, B_RELATIVE_TIMEOUT
| B_CAN_INTERRUPT, 50000);
switch (status) {
case B_OK:
// TRACE_ICE(("B_NO_ERROR\n"));
cpu_status = lock();
@@ -648,9 +646,9 @@ ice1712_buffer_exchange(ice1712 *card, multi_buffer_info *data)
return B_OK;
}
status_t ice1712_buffer_force_stop(ice1712 *card)
{
write_mt_uint8(card, MT_PROF_PB_CONTROL, 0);
return B_OK;
}