AC97 driver: replace some usage of strcpy() by strlcpy()

CID 8921, CID 8920, CID 8919, CID 8922.  Also fixes some coding
style issues.
This commit is contained in:
Philippe Saint-Pierre
2011-12-30 00:08:00 -05:00
parent c7199625ef
commit fbbed9473f
@@ -43,6 +43,7 @@
#include "util.h" #include "util.h"
#include "io.h" #include "io.h"
static void static void
auvia_ac97_get_mix(void *card, const void *cookie, int32 type, float *values) { auvia_ac97_get_mix(void *card, const void *cookie, int32 type, float *values) {
auvia_dev *dev = (auvia_dev*)card; auvia_dev *dev = (auvia_dev*)card;
@@ -50,28 +51,28 @@ auvia_ac97_get_mix(void *card, const void *cookie, int32 type, float *values) {
uint16 value, mask; uint16 value, mask;
float gain; float gain;
switch(type) { switch (type) {
case B_MIX_GAIN: case B_MIX_GAIN:
value = auvia_codec_read(&dev->config, info->reg); value = auvia_codec_read(&dev->config, info->reg);
//PRINT(("B_MIX_GAIN value : %u\n", value)); //PRINT(("B_MIX_GAIN value : %u\n", value));
if(info->type & B_MIX_STEREO) { if (info->type & B_MIX_STEREO) {
mask = ((1 << (info->bits + 1)) - 1) << 8; mask = ((1 << (info->bits + 1)) - 1) << 8;
gain = ((value & mask) >> 8) * info->granularity; gain = ((value & mask) >> 8) * info->granularity;
if(info->polarity == 1) if (info->polarity == 1)
values[0] = info->max_gain - gain; values[0] = info->max_gain - gain;
else else
values[0] = gain - info->min_gain; values[0] = gain - info->min_gain;
mask = ((1 << (info->bits + 1)) - 1); mask = ((1 << (info->bits + 1)) - 1);
gain = (value & mask) * info->granularity; gain = (value & mask) * info->granularity;
if(info->polarity == 1) if (info->polarity == 1)
values[1] = info->max_gain - gain; values[1] = info->max_gain - gain;
else else
values[1] = gain - info->min_gain; values[1] = gain - info->min_gain;
} else { } else {
mask = ((1 << (info->bits + 1)) - 1); mask = ((1 << (info->bits + 1)) - 1);
gain = (value & mask) * info->granularity; gain = (value & mask) * info->granularity;
if(info->polarity == 1) if (info->polarity == 1)
values[0] = info->max_gain - gain; values[0] = info->max_gain - gain;
else else
values[0] = gain - info->min_gain; values[0] = gain - info->min_gain;
@@ -108,14 +109,14 @@ auvia_ac97_set_mix(void *card, const void *cookie, int32 type, float *values) {
uint16 value, mask; uint16 value, mask;
float gain; float gain;
switch(type) { switch (type) {
case B_MIX_GAIN: case B_MIX_GAIN:
value = auvia_codec_read(&dev->config, info->reg); value = auvia_codec_read(&dev->config, info->reg);
if(info->type & B_MIX_STEREO) { if (info->type & B_MIX_STEREO) {
mask = ((1 << (info->bits + 1)) - 1) << 8; mask = ((1 << (info->bits + 1)) - 1) << 8;
value &= ~mask; value &= ~mask;
if(info->polarity == 1) if (info->polarity == 1)
gain = info->max_gain - values[0]; gain = info->max_gain - values[0];
else else
gain = values[0] - info->min_gain; gain = values[0] - info->min_gain;
@@ -123,7 +124,7 @@ auvia_ac97_set_mix(void *card, const void *cookie, int32 type, float *values) {
mask = ((1 << (info->bits + 1)) - 1); mask = ((1 << (info->bits + 1)) - 1);
value &= ~mask; value &= ~mask;
if(info->polarity == 1) if (info->polarity == 1)
gain = info->max_gain - values[1]; gain = info->max_gain - values[1];
else else
gain = values[1] - info->min_gain; gain = values[1] - info->min_gain;
@@ -131,7 +132,7 @@ auvia_ac97_set_mix(void *card, const void *cookie, int32 type, float *values) {
} else { } else {
mask = ((1 << (info->bits + 1)) - 1); mask = ((1 << (info->bits + 1)) - 1);
value &= ~mask; value &= ~mask;
if(info->polarity == 1) if (info->polarity == 1)
gain = info->max_gain - values[0]; gain = info->max_gain - values[0];
else else
gain = values[0] - info->min_gain; gain = values[0] - info->min_gain;
@@ -145,7 +146,7 @@ auvia_ac97_set_mix(void *card, const void *cookie, int32 type, float *values) {
value = auvia_codec_read(&dev->config, info->reg); value = auvia_codec_read(&dev->config, info->reg);
value &= ~mask; value &= ~mask;
value |= ((values[0] == 1.0 ? 1 : 0 ) << 15 & mask); value |= ((values[0] == 1.0 ? 1 : 0 ) << 15 & mask);
if(info->reg == AC97_SURR_VOLUME) { if (info->reg == AC97_SURR_VOLUME) {
// there is a independent mute for each channel // there is a independent mute for each channel
mask = ((1 << 1) - 1) << 7; mask = ((1 << 1) - 1) << 7;
value &= ~mask; value &= ~mask;
@@ -173,9 +174,11 @@ auvia_ac97_set_mix(void *card, const void *cookie, int32 type, float *values) {
} }
static int32 static int32
auvia_create_group_control(multi_dev *multi, int32 *index, int32 parent, auvia_create_group_control(multi_dev *multi, int32 *index, int32 parent,
int32 string, const char* name) { int32 string, const char* name)
{
int32 i = *index; int32 i = *index;
(*index)++; (*index)++;
multi->controls[i].mix_control.id = EMU_MULTI_CONTROL_FIRSTID + i; multi->controls[i].mix_control.id = EMU_MULTI_CONTROL_FIRSTID + i;
@@ -183,12 +186,14 @@ auvia_create_group_control(multi_dev *multi, int32 *index, int32 parent,
multi->controls[i].mix_control.flags = B_MULTI_MIX_GROUP; multi->controls[i].mix_control.flags = B_MULTI_MIX_GROUP;
multi->controls[i].mix_control.master = EMU_MULTI_CONTROL_MASTERID; multi->controls[i].mix_control.master = EMU_MULTI_CONTROL_MASTERID;
multi->controls[i].mix_control.string = string; multi->controls[i].mix_control.string = string;
if(name) if (name)
strcpy(multi->controls[i].mix_control.name, name); strlcpy(multi->controls[i].mix_control.name, name,
sizeof(multi->controls[i].mix_control.name));
return multi->controls[i].mix_control.id; return multi->controls[i].mix_control.id;
} }
static status_t static status_t
auvia_create_controls_list(multi_dev *multi) auvia_create_controls_list(multi_dev *multi)
{ {
@@ -204,8 +209,8 @@ auvia_create_controls_list(multi_dev *multi)
parent2 = auvia_create_group_control(multi, &index, parent, 0, info->name); parent2 = auvia_create_group_control(multi, &index, parent, 0, info->name);
if(info->type & B_MIX_GAIN) { if (info->type & B_MIX_GAIN) {
if(info->type & B_MIX_MUTE) { if (info->type & B_MIX_MUTE) {
multi->controls[index].mix_control.id = EMU_MULTI_CONTROL_FIRSTID + index; multi->controls[index].mix_control.id = EMU_MULTI_CONTROL_FIRSTID + index;
multi->controls[index].mix_control.flags = B_MULTI_MIX_ENABLE; multi->controls[index].mix_control.flags = B_MULTI_MIX_ENABLE;
multi->controls[index].mix_control.master = EMU_MULTI_CONTROL_MASTERID; multi->controls[index].mix_control.master = EMU_MULTI_CONTROL_MASTERID;
@@ -222,7 +227,8 @@ auvia_create_controls_list(multi_dev *multi)
multi->controls[index].mix_control.flags = B_MULTI_MIX_GAIN; multi->controls[index].mix_control.flags = B_MULTI_MIX_GAIN;
multi->controls[index].mix_control.master = EMU_MULTI_CONTROL_MASTERID; multi->controls[index].mix_control.master = EMU_MULTI_CONTROL_MASTERID;
multi->controls[index].mix_control.parent = parent2; multi->controls[index].mix_control.parent = parent2;
strcpy(multi->controls[index].mix_control.name, info->name); strlcpy(multi->controls[index].mix_control.name, info->name,
sizeof(multi->controls[index].mix_control.name));
multi->controls[index].mix_control.u.gain.min_gain = info->min_gain; multi->controls[index].mix_control.u.gain.min_gain = info->min_gain;
multi->controls[index].mix_control.u.gain.max_gain = info->max_gain; multi->controls[index].mix_control.u.gain.max_gain = info->max_gain;
multi->controls[index].mix_control.u.gain.granularity = info->granularity; multi->controls[index].mix_control.u.gain.granularity = info->granularity;
@@ -233,12 +239,13 @@ auvia_create_controls_list(multi_dev *multi)
id = multi->controls[index].mix_control.id; id = multi->controls[index].mix_control.id;
index++; index++;
if(info->type & B_MIX_STEREO) { if (info->type & B_MIX_STEREO) {
multi->controls[index].mix_control.id = EMU_MULTI_CONTROL_FIRSTID + index; multi->controls[index].mix_control.id = EMU_MULTI_CONTROL_FIRSTID + index;
multi->controls[index].mix_control.flags = B_MULTI_MIX_GAIN; multi->controls[index].mix_control.flags = B_MULTI_MIX_GAIN;
multi->controls[index].mix_control.master = id; multi->controls[index].mix_control.master = id;
multi->controls[index].mix_control.parent = parent2; multi->controls[index].mix_control.parent = parent2;
strcpy(multi->controls[index].mix_control.name, info->name); strlcpy(multi->controls[index].mix_control.name, info->name,
sizeof(multi->controls[index].mix_control.name));
multi->controls[index].mix_control.u.gain.min_gain = info->min_gain; multi->controls[index].mix_control.u.gain.min_gain = info->min_gain;
multi->controls[index].mix_control.u.gain.max_gain = info->max_gain; multi->controls[index].mix_control.u.gain.max_gain = info->max_gain;
multi->controls[index].mix_control.u.gain.granularity = info->granularity; multi->controls[index].mix_control.u.gain.granularity = info->granularity;
@@ -249,7 +256,7 @@ auvia_create_controls_list(multi_dev *multi)
index++; index++;
} }
if(info->type & B_MIX_RECORDMUX) { if (info->type & B_MIX_RECORDMUX) {
multi->controls[index].mix_control.id = EMU_MULTI_CONTROL_FIRSTID + index; multi->controls[index].mix_control.id = EMU_MULTI_CONTROL_FIRSTID + index;
multi->controls[index].mix_control.flags = B_MULTI_MIX_MUX; multi->controls[index].mix_control.flags = B_MULTI_MIX_MUX;
multi->controls[index].mix_control.parent = parent2; multi->controls[index].mix_control.parent = parent2;
@@ -309,14 +316,14 @@ auvia_create_controls_list(multi_dev *multi)
count = source_info_size; count = source_info_size;
count--; count--;
for(i = 1; i < count ; i++) { for (i = 1; i < count ; i++) {
info = &source_info[i]; info = &source_info[i];
PRINT(("name : %s\n", info->name)); PRINT(("name : %s\n", info->name));
parent2 = auvia_create_group_control(multi, &index, parent, 0, info->name); parent2 = auvia_create_group_control(multi, &index, parent, 0, info->name);
if(info->type & B_MIX_GAIN) { if (info->type & B_MIX_GAIN) {
if(info->type & B_MIX_MUTE) { if (info->type & B_MIX_MUTE) {
multi->controls[index].mix_control.id = EMU_MULTI_CONTROL_FIRSTID + index; multi->controls[index].mix_control.id = EMU_MULTI_CONTROL_FIRSTID + index;
multi->controls[index].mix_control.flags = B_MULTI_MIX_ENABLE; multi->controls[index].mix_control.flags = B_MULTI_MIX_ENABLE;
multi->controls[index].mix_control.master = EMU_MULTI_CONTROL_MASTERID; multi->controls[index].mix_control.master = EMU_MULTI_CONTROL_MASTERID;
@@ -333,7 +340,8 @@ auvia_create_controls_list(multi_dev *multi)
multi->controls[index].mix_control.flags = B_MULTI_MIX_GAIN; multi->controls[index].mix_control.flags = B_MULTI_MIX_GAIN;
multi->controls[index].mix_control.master = EMU_MULTI_CONTROL_MASTERID; multi->controls[index].mix_control.master = EMU_MULTI_CONTROL_MASTERID;
multi->controls[index].mix_control.parent = parent2; multi->controls[index].mix_control.parent = parent2;
strcpy(multi->controls[index].mix_control.name, info->name); strlcpy(multi->controls[index].mix_control.name, info->name,
sizeof(multi->controls[index].mix_control.name));
multi->controls[index].mix_control.u.gain.min_gain = info->min_gain; multi->controls[index].mix_control.u.gain.min_gain = info->min_gain;
multi->controls[index].mix_control.u.gain.max_gain = info->max_gain; multi->controls[index].mix_control.u.gain.max_gain = info->max_gain;
multi->controls[index].mix_control.u.gain.granularity = info->granularity; multi->controls[index].mix_control.u.gain.granularity = info->granularity;
@@ -344,12 +352,13 @@ auvia_create_controls_list(multi_dev *multi)
id = multi->controls[index].mix_control.id; id = multi->controls[index].mix_control.id;
index++; index++;
if(info->type & B_MIX_STEREO) { if (info->type & B_MIX_STEREO) {
multi->controls[index].mix_control.id = EMU_MULTI_CONTROL_FIRSTID + index; multi->controls[index].mix_control.id = EMU_MULTI_CONTROL_FIRSTID + index;
multi->controls[index].mix_control.flags = B_MULTI_MIX_GAIN; multi->controls[index].mix_control.flags = B_MULTI_MIX_GAIN;
multi->controls[index].mix_control.master = id; multi->controls[index].mix_control.master = id;
multi->controls[index].mix_control.parent = parent2; multi->controls[index].mix_control.parent = parent2;
strcpy(multi->controls[index].mix_control.name, info->name); strlcpy(multi->controls[index].mix_control.name, info->name,
sizeof(multi->controls[index].mix_control.name));
multi->controls[index].mix_control.u.gain.min_gain = info->min_gain; multi->controls[index].mix_control.u.gain.min_gain = info->min_gain;
multi->controls[index].mix_control.u.gain.max_gain = info->max_gain; multi->controls[index].mix_control.u.gain.max_gain = info->max_gain;
multi->controls[index].mix_control.u.gain.granularity = info->granularity; multi->controls[index].mix_control.u.gain.granularity = info->granularity;
@@ -367,7 +376,7 @@ auvia_create_controls_list(multi_dev *multi)
/* AC97 20db Boost Mic */ /* AC97 20db Boost Mic */
info = &source_info[6]; info = &source_info[6];
if(info->type & B_MIX_GAIN && info->type & B_MIX_MICBOOST) { if (info->type & B_MIX_GAIN && info->type & B_MIX_MICBOOST) {
multi->controls[index].mix_control.id = EMU_MULTI_CONTROL_FIRSTID + index; multi->controls[index].mix_control.id = EMU_MULTI_CONTROL_FIRSTID + index;
multi->controls[index].mix_control.flags = B_MULTI_MIX_ENABLE; multi->controls[index].mix_control.flags = B_MULTI_MIX_ENABLE;
multi->controls[index].mix_control.master = EMU_MULTI_CONTROL_MASTERID; multi->controls[index].mix_control.master = EMU_MULTI_CONTROL_MASTERID;
@@ -385,37 +394,38 @@ auvia_create_controls_list(multi_dev *multi)
return B_OK; return B_OK;
} }
static status_t static status_t
auvia_get_mix(auvia_dev *card, multi_mix_value_info * mmvi) auvia_get_mix(auvia_dev *card, multi_mix_value_info * mmvi)
{ {
int32 i, id; int32 i, id;
multi_mixer_control *control = NULL; multi_mixer_control *control = NULL;
for(i = 0; i < mmvi->item_count; i++) { for (i = 0; i < mmvi->item_count; i++) {
id = mmvi->values[i].id - EMU_MULTI_CONTROL_FIRSTID; id = mmvi->values[i].id - EMU_MULTI_CONTROL_FIRSTID;
if(id < 0 || id >= card->multi.control_count) { if (id < 0 || id >= card->multi.control_count) {
PRINT(("auvia_get_mix : invalid control id requested : %li\n", id)); PRINT(("auvia_get_mix : invalid control id requested : %li\n", id));
continue; continue;
} }
control = &card->multi.controls[id]; control = &card->multi.controls[id];
if(control->mix_control.flags & B_MULTI_MIX_GAIN) { if (control->mix_control.flags & B_MULTI_MIX_GAIN) {
if(control->get) { if (control->get) {
float values[2]; float values[2];
control->get(card, control->cookie, control->type, values); control->get(card, control->cookie, control->type, values);
if(control->mix_control.master == EMU_MULTI_CONTROL_MASTERID) if (control->mix_control.master == EMU_MULTI_CONTROL_MASTERID)
mmvi->values[i].u.gain = values[0]; mmvi->values[i].u.gain = values[0];
else else
mmvi->values[i].u.gain = values[1]; mmvi->values[i].u.gain = values[1];
} }
} }
if(control->mix_control.flags & B_MULTI_MIX_ENABLE && control->get) { if (control->mix_control.flags & B_MULTI_MIX_ENABLE && control->get) {
float values[1]; float values[1];
control->get(card, control->cookie, control->type, values); control->get(card, control->cookie, control->type, values);
mmvi->values[i].u.enable = (values[0] == 1.0); mmvi->values[i].u.enable = (values[0] == 1.0);
} }
if(control->mix_control.flags & B_MULTI_MIX_MUX && control->get) { if (control->mix_control.flags & B_MULTI_MIX_MUX && control->get) {
float values[1]; float values[1];
control->get(card, control->cookie, control->type, values); control->get(card, control->cookie, control->type, values);
mmvi->values[i].u.mux = (int32)values[0]; mmvi->values[i].u.mux = (int32)values[0];
@@ -424,60 +434,61 @@ auvia_get_mix(auvia_dev *card, multi_mix_value_info * mmvi)
return B_OK; return B_OK;
} }
static status_t static status_t
auvia_set_mix(auvia_dev *card, multi_mix_value_info * mmvi) auvia_set_mix(auvia_dev *card, multi_mix_value_info * mmvi)
{ {
int32 i, id; int32 i, id;
multi_mixer_control *control = NULL; multi_mixer_control *control = NULL;
for(i = 0; i < mmvi->item_count; i++) { for (i = 0; i < mmvi->item_count; i++) {
id = mmvi->values[i].id - EMU_MULTI_CONTROL_FIRSTID; id = mmvi->values[i].id - EMU_MULTI_CONTROL_FIRSTID;
if(id < 0 || id >= card->multi.control_count) { if (id < 0 || id >= card->multi.control_count) {
PRINT(("auvia_set_mix : invalid control id requested : %li\n", id)); PRINT(("auvia_set_mix : invalid control id requested : %li\n", id));
continue; continue;
} }
control = &card->multi.controls[id]; control = &card->multi.controls[id];
if(control->mix_control.flags & B_MULTI_MIX_GAIN) { if (control->mix_control.flags & B_MULTI_MIX_GAIN) {
multi_mixer_control *control2 = NULL; multi_mixer_control *control2 = NULL;
if(i+1<mmvi->item_count) { if (i + 1 < mmvi->item_count) {
id = mmvi->values[i + 1].id - EMU_MULTI_CONTROL_FIRSTID; id = mmvi->values[i + 1].id - EMU_MULTI_CONTROL_FIRSTID;
if(id < 0 || id >= card->multi.control_count) { if (id < 0 || id >= card->multi.control_count) {
PRINT(("auvia_set_mix : invalid control id requested : %li\n", id)); PRINT(("auvia_set_mix : invalid control id requested : %li\n", id));
} else { } else {
control2 = &card->multi.controls[id]; control2 = &card->multi.controls[id];
if(control2->mix_control.master != control->mix_control.id) if (control2->mix_control.master != control->mix_control.id)
control2 = NULL; control2 = NULL;
} }
} }
if(control->set) { if (control->set) {
float values[2]; float values[2];
values[0] = 0.0; values[0] = 0.0;
values[1] = 0.0; values[1] = 0.0;
if(control->mix_control.master == EMU_MULTI_CONTROL_MASTERID) if (control->mix_control.master == EMU_MULTI_CONTROL_MASTERID)
values[0] = mmvi->values[i].u.gain; values[0] = mmvi->values[i].u.gain;
else else
values[1] = mmvi->values[i].u.gain; values[1] = mmvi->values[i].u.gain;
if(control2 && control2->mix_control.master != EMU_MULTI_CONTROL_MASTERID) if (control2 && control2->mix_control.master != EMU_MULTI_CONTROL_MASTERID)
values[1] = mmvi->values[i+1].u.gain; values[1] = mmvi->values[i + 1].u.gain;
control->set(card, control->cookie, control->type, values); control->set(card, control->cookie, control->type, values);
} }
if(control2) if (control2)
i++; i++;
} }
if(control->mix_control.flags & B_MULTI_MIX_ENABLE && control->set) { if (control->mix_control.flags & B_MULTI_MIX_ENABLE && control->set) {
float values[1]; float values[1];
values[0] = mmvi->values[i].u.enable ? 1.0 : 0.0; values[0] = mmvi->values[i].u.enable ? 1.0 : 0.0;
control->set(card, control->cookie, control->type, values); control->set(card, control->cookie, control->type, values);
} }
if(control->mix_control.flags & B_MULTI_MIX_MUX && control->set) { if (control->mix_control.flags & B_MULTI_MIX_MUX && control->set) {
float values[1]; float values[1];
values[0] = (float)mmvi->values[i].u.mux; values[0] = (float)mmvi->values[i].u.mux;
@@ -487,6 +498,7 @@ auvia_set_mix(auvia_dev *card, multi_mix_value_info * mmvi)
return B_OK; return B_OK;
} }
static status_t static status_t
auvia_list_mix_controls(auvia_dev *card, multi_mix_control_info * mmci) auvia_list_mix_controls(auvia_dev *card, multi_mix_control_info * mmci)
{ {
@@ -494,12 +506,12 @@ auvia_list_mix_controls(auvia_dev *card, multi_mix_control_info * mmci)
int32 i; int32 i;
mmc = mmci->controls; mmc = mmci->controls;
if(mmci->control_count < 24) if (mmci->control_count < 24)
return B_ERROR; return B_ERROR;
if(auvia_create_controls_list(&card->multi) < B_OK) if (auvia_create_controls_list(&card->multi) < B_OK)
return B_ERROR; return B_ERROR;
for(i = 0; i < card->multi.control_count; i++) { for (i = 0; i < card->multi.control_count; i++) {
mmc[i] = card->multi.controls[i].mix_control; mmc[i] = card->multi.controls[i].mix_control;
} }
@@ -507,12 +519,14 @@ auvia_list_mix_controls(auvia_dev *card, multi_mix_control_info * mmci)
return B_OK; return B_OK;
} }
static status_t static status_t
auvia_list_mix_connections(auvia_dev *card, multi_mix_connection_info * data) auvia_list_mix_connections(auvia_dev *card, multi_mix_connection_info * data)
{ {
return B_ERROR; return B_ERROR;
} }
static status_t static status_t
auvia_list_mix_channels(auvia_dev *card, multi_mix_channel_info *data) auvia_list_mix_channels(auvia_dev *card, multi_mix_channel_info *data)
{ {
@@ -570,18 +584,18 @@ auvia_create_channels_list(multi_dev *multi)
chans = multi->chans; chans = multi->chans;
index = 0; index = 0;
for(mode=AUVIA_USE_PLAY; mode!=-1; for (mode = AUVIA_USE_PLAY; mode != -1;
mode = (mode == AUVIA_USE_PLAY) ? AUVIA_USE_RECORD : -1) { mode = (mode == AUVIA_USE_PLAY) ? AUVIA_USE_RECORD : -1) {
LIST_FOREACH(stream, &((auvia_dev*)multi->card)->streams, next) { LIST_FOREACH(stream, &((auvia_dev*)multi->card)->streams, next) {
if ((stream->use & mode) == 0) if ((stream->use & mode) == 0)
continue; continue;
if(stream->channels == 2) if (stream->channels == 2)
designations = B_CHANNEL_STEREO_BUS; designations = B_CHANNEL_STEREO_BUS;
else else
designations = B_CHANNEL_SURROUND_BUS; designations = B_CHANNEL_SURROUND_BUS;
for(i = 0; i < stream->channels; i++) { for (i = 0; i < stream->channels; i++) {
chans[index].channel_id = index; chans[index].channel_id = index;
chans[index].kind = (mode == AUVIA_USE_PLAY) ? B_MULTI_OUTPUT_CHANNEL : B_MULTI_INPUT_CHANNEL; chans[index].kind = (mode == AUVIA_USE_PLAY) ? B_MULTI_OUTPUT_CHANNEL : B_MULTI_INPUT_CHANNEL;
chans[index].designations = designations | chan_designations[i]; chans[index].designations = designations | chan_designations[i];
@@ -590,7 +604,7 @@ auvia_create_channels_list(multi_dev *multi)
} }
} }
if(mode==AUVIA_USE_PLAY) { if (mode == AUVIA_USE_PLAY) {
multi->output_channel_count = index; multi->output_channel_count = index;
} else { } else {
multi->input_channel_count = index - multi->output_channel_count; multi->input_channel_count = index - multi->output_channel_count;
@@ -639,10 +653,10 @@ auvia_get_description(auvia_dev *card, multi_description *data)
data->interface_version = B_CURRENT_INTERFACE_VERSION; data->interface_version = B_CURRENT_INTERFACE_VERSION;
data->interface_minimum = B_CURRENT_INTERFACE_VERSION; data->interface_minimum = B_CURRENT_INTERFACE_VERSION;
if(IS_686(&card->config)) if (IS_686(&card->config))
strncpy(data->friendly_name, FRIENDLY_NAME_686, 32); strncpy(data->friendly_name, FRIENDLY_NAME_686, 32);
else if(IS_8233(&card->config)) { else if (IS_8233(&card->config)) {
switch(card->info.revision) { switch (card->info.revision) {
case VIATECH_8233_AC97_REV_8233_10: case VIATECH_8233_AC97_REV_8233_10:
strncpy(data->friendly_name, FRIENDLY_NAME_8233, 32); strncpy(data->friendly_name, FRIENDLY_NAME_8233, 32);
break; break;
@@ -709,11 +723,12 @@ auvia_get_description(auvia_dev *card, multi_description *data)
data->interface_flags = B_MULTI_INTERFACE_PLAYBACK | B_MULTI_INTERFACE_RECORD; data->interface_flags = B_MULTI_INTERFACE_PLAYBACK | B_MULTI_INTERFACE_RECORD;
data->start_latency = 3000; data->start_latency = 3000;
strcpy(data->control_panel,""); strcpy(data->control_panel, "");
return B_OK; return B_OK;
} }
static status_t static status_t
auvia_get_enabled_channels(auvia_dev *card, multi_channel_enable *data) auvia_get_enabled_channels(auvia_dev *card, multi_channel_enable *data)
{ {
@@ -731,6 +746,7 @@ auvia_get_enabled_channels(auvia_dev *card, multi_channel_enable *data)
return B_OK; return B_OK;
} }
static status_t static status_t
auvia_set_enabled_channels(auvia_dev *card, multi_channel_enable *data) auvia_set_enabled_channels(auvia_dev *card, multi_channel_enable *data)
{ {
@@ -741,6 +757,7 @@ auvia_set_enabled_channels(auvia_dev *card, multi_channel_enable *data)
return B_OK; return B_OK;
} }
static status_t static status_t
auvia_get_global_format(auvia_dev *card, multi_format_info *data) auvia_get_global_format(auvia_dev *card, multi_format_info *data)
{ {
@@ -762,6 +779,7 @@ auvia_get_global_format(auvia_dev *card, multi_format_info *data)
return B_OK; return B_OK;
} }
static status_t static status_t
auvia_get_buffers(auvia_dev *card, multi_buffer_list *data) auvia_get_buffers(auvia_dev *card, multi_buffer_list *data)
{ {
@@ -794,8 +812,8 @@ auvia_get_buffers(auvia_dev *card, multi_buffer_list *data)
data->return_playback_channels = pchannels; /* playback_buffers[][c] */ data->return_playback_channels = pchannels; /* playback_buffers[][c] */
data->return_playback_buffer_size = BUFFER_FRAMES; /* frames */ data->return_playback_buffer_size = BUFFER_FRAMES; /* frames */
for(i = 0; i < BUFFER_COUNT; i++) for (i = 0; i < BUFFER_COUNT; i++)
for(j=0; j<pchannels; j++) for (j = 0; j < pchannels; j++)
auvia_stream_get_nth_buffer(card->pstream, j, i, auvia_stream_get_nth_buffer(card->pstream, j, i,
&data->playback_buffers[i][j].base, &data->playback_buffers[i][j].base,
&data->playback_buffers[i][j].stride); &data->playback_buffers[i][j].stride);
@@ -804,8 +822,8 @@ auvia_get_buffers(auvia_dev *card, multi_buffer_list *data)
data->return_record_channels = rchannels; data->return_record_channels = rchannels;
data->return_record_buffer_size = BUFFER_FRAMES; /* frames */ data->return_record_buffer_size = BUFFER_FRAMES; /* frames */
for(i = 0; i < BUFFER_COUNT; i++) for (i = 0; i < BUFFER_COUNT; i++)
for(j=0; j<rchannels; j++) for (j = 0; j<rchannels; j++)
auvia_stream_get_nth_buffer(card->rstream, j, i, auvia_stream_get_nth_buffer(card->rstream, j, i,
&data->record_buffers[i][j].base, &data->record_buffers[i][j].base,
&data->record_buffers[i][j].stride); &data->record_buffers[i][j].stride);
@@ -826,7 +844,7 @@ auvia_play_inth(void* inthparams)
stream->real_time = system_time(); stream->real_time = system_time();
stream->frames_count += BUFFER_FRAMES; stream->frames_count += BUFFER_FRAMES;
stream->buffer_cycle = (stream->trigblk stream->buffer_cycle = (stream->trigblk
+ stream->blkmod -1) % stream->blkmod; + stream->blkmod - 1) % stream->blkmod;
stream->update_needed = true; stream->update_needed = true;
release_spinlock(&slock); release_spinlock(&slock);
@@ -835,6 +853,7 @@ auvia_play_inth(void* inthparams)
release_sem_etc(stream->card->buffer_ready_sem, 1, B_DO_NOT_RESCHEDULE); release_sem_etc(stream->card->buffer_ready_sem, 1, B_DO_NOT_RESCHEDULE);
} }
static void static void
auvia_record_inth(void* inthparams) auvia_record_inth(void* inthparams)
{ {
@@ -847,7 +866,7 @@ auvia_record_inth(void* inthparams)
stream->real_time = system_time(); stream->real_time = system_time();
stream->frames_count += BUFFER_FRAMES; stream->frames_count += BUFFER_FRAMES;
stream->buffer_cycle = (stream->trigblk stream->buffer_cycle = (stream->trigblk
+ stream->blkmod -1) % stream->blkmod; + stream->blkmod - 1) % stream->blkmod;
stream->update_needed = true; stream->update_needed = true;
release_spinlock(&slock); release_spinlock(&slock);
@@ -856,6 +875,7 @@ auvia_record_inth(void* inthparams)
release_sem_etc(stream->card->buffer_ready_sem, 1, B_DO_NOT_RESCHEDULE); release_sem_etc(stream->card->buffer_ready_sem, 1, B_DO_NOT_RESCHEDULE);
} }
static status_t static status_t
auvia_buffer_exchange(auvia_dev *card, multi_buffer_info *data) auvia_buffer_exchange(auvia_dev *card, multi_buffer_info *data)
{ {
@@ -878,7 +898,7 @@ auvia_buffer_exchange(auvia_dev *card, multi_buffer_info *data)
if (!(card->rstream->state & AUVIA_STATE_STARTED)) if (!(card->rstream->state & AUVIA_STATE_STARTED))
auvia_stream_start(card->rstream, auvia_record_inth, card->rstream); auvia_stream_start(card->rstream, auvia_record_inth, card->rstream);
if(acquire_sem_etc(card->buffer_ready_sem, 1, B_RELATIVE_TIMEOUT | B_CAN_INTERRUPT, 50000) if (acquire_sem_etc(card->buffer_ready_sem, 1, B_RELATIVE_TIMEOUT | B_CAN_INTERRUPT, 50000)
== B_TIMED_OUT) { == B_TIMED_OUT) {
LOG(("buffer_exchange timeout ff\n")); LOG(("buffer_exchange timeout ff\n"));
} }
@@ -889,7 +909,7 @@ auvia_buffer_exchange(auvia_dev *card, multi_buffer_info *data)
if ((pstream->use & AUVIA_USE_PLAY) == 0 || if ((pstream->use & AUVIA_USE_PLAY) == 0 ||
(pstream->state & AUVIA_STATE_STARTED) == 0) (pstream->state & AUVIA_STATE_STARTED) == 0)
continue; continue;
if(pstream->update_needed) if (pstream->update_needed)
break; break;
} }
@@ -897,13 +917,13 @@ auvia_buffer_exchange(auvia_dev *card, multi_buffer_info *data)
if ((rstream->use & AUVIA_USE_RECORD) == 0 || if ((rstream->use & AUVIA_USE_RECORD) == 0 ||
(rstream->state & AUVIA_STATE_STARTED) == 0) (rstream->state & AUVIA_STATE_STARTED) == 0)
continue; continue;
if(rstream->update_needed) if (rstream->update_needed)
break; break;
} }
if(!pstream) if (!pstream)
pstream = card->pstream; pstream = card->pstream;
if(!rstream) if (!rstream)
rstream = card->rstream; rstream = card->rstream;
/* do playback */ /* do playback */
@@ -932,6 +952,7 @@ auvia_buffer_exchange(auvia_dev *card, multi_buffer_info *data)
return B_OK; return B_OK;
} }
static status_t static status_t
auvia_buffer_force_stop(auvia_dev *card) auvia_buffer_force_stop(auvia_dev *card)
{ {
@@ -939,6 +960,7 @@ auvia_buffer_force_stop(auvia_dev *card)
return B_OK; return B_OK;
} }
static status_t static status_t
auvia_multi_control(void *cookie, uint32 op, void *data, size_t length) auvia_multi_control(void *cookie, uint32 op, void *data, size_t length)
{ {
@@ -1032,6 +1054,7 @@ device_hooks multi_hooks = {
NULL /* scatter-gather write to the device */ NULL /* scatter-gather write to the device */
}; };
static status_t static status_t
auvia_open(const char *name, uint32 flags, void** cookie) auvia_open(const char *name, uint32 flags, void** cookie)
{ {
@@ -1046,7 +1069,7 @@ auvia_open(const char *name, uint32 flags, void** cookie)
} }
} }
if(card == NULL) { if (card == NULL) {
LOG(("open() card not found %s\n", name)); LOG(("open() card not found %s\n", name));
for (ix=0; ix<num_cards; ix++) { for (ix=0; ix<num_cards; ix++) {
LOG(("open() card available %s\n", cards[ix].name)); LOG(("open() card available %s\n", cards[ix].name));
@@ -1056,9 +1079,9 @@ auvia_open(const char *name, uint32 flags, void** cookie)
LOG(("open() got card\n")); LOG(("open() got card\n"));
if(card->pstream !=NULL) if (card->pstream !=NULL)
return B_ERROR; return B_ERROR;
if(card->rstream !=NULL) if (card->rstream !=NULL)
return B_ERROR; return B_ERROR;
*cookie = card; *cookie = card;
@@ -1087,6 +1110,7 @@ auvia_open(const char *name, uint32 flags, void** cookie)
return B_OK; return B_OK;
} }
static status_t static status_t
auvia_close(void* cookie) auvia_close(void* cookie)
{ {
@@ -1096,6 +1120,7 @@ auvia_close(void* cookie)
return B_OK; return B_OK;
} }
static status_t static status_t
auvia_free(void* cookie) auvia_free(void* cookie)
{ {
@@ -1110,7 +1135,7 @@ auvia_free(void* cookie)
auvia_stream_halt(stream); auvia_stream_halt(stream);
} }
while(!LIST_EMPTY(&card->streams)) { while (!LIST_EMPTY(&card->streams)) {
auvia_stream_delete(LIST_FIRST(&card->streams)); auvia_stream_delete(LIST_FIRST(&card->streams));
} }
@@ -1120,12 +1145,14 @@ auvia_free(void* cookie)
return B_OK; return B_OK;
} }
static status_t static status_t
auvia_control(void* cookie, uint32 op, void* arg, size_t len) auvia_control(void* cookie, uint32 op, void* arg, size_t len)
{ {
return auvia_multi_control(cookie, op, arg, len); return auvia_multi_control(cookie, op, arg, len);
} }
static status_t static status_t
auvia_read(void* cookie, off_t position, void *buf, size_t* num_bytes) auvia_read(void* cookie, off_t position, void *buf, size_t* num_bytes)
{ {
@@ -1133,6 +1160,7 @@ auvia_read(void* cookie, off_t position, void *buf, size_t* num_bytes)
return B_IO_ERROR; return B_IO_ERROR;
} }
static status_t static status_t
auvia_write(void* cookie, off_t position, const void* buffer, size_t* num_bytes) auvia_write(void* cookie, off_t position, const void* buffer, size_t* num_bytes)
{ {