Commit 97d78acf authored by Andrej Krutak's avatar Andrej Krutak Committed by Takashi Iwai

ALSA: line6: Allow different channel numbers for in/out

Changes bytes_per_frame to bytes_per_channel.
Signed-off-by: default avatarAndrej Krutak <dev@andree.sk>
Signed-off-by: default avatarTakashi Iwai <tiwai@suse.de>
parent 7a0f55ae
...@@ -90,7 +90,9 @@ void line6_capture_copy(struct snd_line6_pcm *line6pcm, char *fbuf, int fsize) ...@@ -90,7 +90,9 @@ void line6_capture_copy(struct snd_line6_pcm *line6pcm, char *fbuf, int fsize)
struct snd_pcm_substream *substream = struct snd_pcm_substream *substream =
get_substream(line6pcm, SNDRV_PCM_STREAM_CAPTURE); get_substream(line6pcm, SNDRV_PCM_STREAM_CAPTURE);
struct snd_pcm_runtime *runtime = substream->runtime; struct snd_pcm_runtime *runtime = substream->runtime;
const int bytes_per_frame = line6pcm->properties->bytes_per_frame; const int bytes_per_frame =
line6pcm->properties->bytes_per_channel *
line6pcm->properties->capture_hw.channels_max;
int frames = fsize / bytes_per_frame; int frames = fsize / bytes_per_frame;
if (runtime == NULL) if (runtime == NULL)
...@@ -191,7 +193,9 @@ static void audio_in_callback(struct urb *urb) ...@@ -191,7 +193,9 @@ static void audio_in_callback(struct urb *urb)
*/ */
line6pcm->prev_fbuf = fbuf; line6pcm->prev_fbuf = fbuf;
line6pcm->prev_fsize = fsize; line6pcm->prev_fsize = fsize /
(line6pcm->properties->bytes_per_channel *
line6pcm->properties->capture_hw.channels_max);
if (!test_bit(LINE6_STREAM_IMPULSE, &line6pcm->in.running) && if (!test_bit(LINE6_STREAM_IMPULSE, &line6pcm->in.running) &&
test_bit(LINE6_STREAM_PCM, &line6pcm->in.running) && test_bit(LINE6_STREAM_PCM, &line6pcm->in.running) &&
......
...@@ -31,7 +31,7 @@ ...@@ -31,7 +31,7 @@
#define LINE6_FALLBACK_MAXPACKETSIZE 16 #define LINE6_FALLBACK_MAXPACKETSIZE 16
#define LINE6_TIMEOUT 1 #define LINE6_TIMEOUT 1
#define LINE6_BUFSIZE_LISTEN 32 #define LINE6_BUFSIZE_LISTEN 64
#define LINE6_MESSAGE_MAXLEN 256 #define LINE6_MESSAGE_MAXLEN 256
/* /*
......
...@@ -84,7 +84,7 @@ enum { ...@@ -84,7 +84,7 @@ enum {
struct line6_pcm_properties { struct line6_pcm_properties {
struct snd_pcm_hardware playback_hw, capture_hw; struct snd_pcm_hardware playback_hw, capture_hw;
struct snd_pcm_hw_constraint_ratdens rates; struct snd_pcm_hw_constraint_ratdens rates;
int bytes_per_frame; int bytes_per_channel;
}; };
struct line6_pcm_stream { struct line6_pcm_stream {
......
...@@ -146,7 +146,9 @@ static int submit_audio_out_urb(struct snd_line6_pcm *line6pcm) ...@@ -146,7 +146,9 @@ static int submit_audio_out_urb(struct snd_line6_pcm *line6pcm)
int index; int index;
int i, urb_size, urb_frames; int i, urb_size, urb_frames;
int ret; int ret;
const int bytes_per_frame = line6pcm->properties->bytes_per_frame; const int bytes_per_frame =
line6pcm->properties->bytes_per_channel *
line6pcm->properties->playback_hw.channels_max;
const int frame_increment = const int frame_increment =
line6pcm->properties->rates.rats[0].num_min; line6pcm->properties->rates.rats[0].num_min;
const int frame_factor = const int frame_factor =
...@@ -165,6 +167,7 @@ static int submit_audio_out_urb(struct snd_line6_pcm *line6pcm) ...@@ -165,6 +167,7 @@ static int submit_audio_out_urb(struct snd_line6_pcm *line6pcm)
urb_out = line6pcm->out.urbs[index]; urb_out = line6pcm->out.urbs[index];
urb_size = 0; urb_size = 0;
/* TODO: this may not work for LINE6_ISO_PACKETS != 1 */
for (i = 0; i < LINE6_ISO_PACKETS; ++i) { for (i = 0; i < LINE6_ISO_PACKETS; ++i) {
/* compute frame size for given sampling rate */ /* compute frame size for given sampling rate */
int fsize = 0; int fsize = 0;
...@@ -178,9 +181,11 @@ static int submit_audio_out_urb(struct snd_line6_pcm *line6pcm) ...@@ -178,9 +181,11 @@ static int submit_audio_out_urb(struct snd_line6_pcm *line6pcm)
line6pcm->out.count += frame_increment; line6pcm->out.count += frame_increment;
n = line6pcm->out.count / frame_factor; n = line6pcm->out.count / frame_factor;
line6pcm->out.count -= n * frame_factor; line6pcm->out.count -= n * frame_factor;
fsize = n * bytes_per_frame; fsize = n;
} }
fsize *= bytes_per_frame;
fout->offset = urb_size; fout->offset = urb_size;
fout->length = fsize; fout->length = fsize;
urb_size += fsize; urb_size += fsize;
...@@ -305,6 +310,9 @@ static void audio_out_callback(struct urb *urb) ...@@ -305,6 +310,9 @@ static void audio_out_callback(struct urb *urb)
struct snd_line6_pcm *line6pcm = (struct snd_line6_pcm *)urb->context; struct snd_line6_pcm *line6pcm = (struct snd_line6_pcm *)urb->context;
struct snd_pcm_substream *substream = struct snd_pcm_substream *substream =
get_substream(line6pcm, SNDRV_PCM_STREAM_PLAYBACK); get_substream(line6pcm, SNDRV_PCM_STREAM_PLAYBACK);
const int bytes_per_frame =
line6pcm->properties->bytes_per_channel *
line6pcm->properties->playback_hw.channels_max;
#if USE_CLEAR_BUFFER_WORKAROUND #if USE_CLEAR_BUFFER_WORKAROUND
memset(urb->transfer_buffer, 0, urb->transfer_buffer_length); memset(urb->transfer_buffer, 0, urb->transfer_buffer_length);
...@@ -329,7 +337,7 @@ static void audio_out_callback(struct urb *urb) ...@@ -329,7 +337,7 @@ static void audio_out_callback(struct urb *urb)
struct snd_pcm_runtime *runtime = substream->runtime; struct snd_pcm_runtime *runtime = substream->runtime;
line6pcm->out.pos_done += line6pcm->out.pos_done +=
length / line6pcm->properties->bytes_per_frame; length / bytes_per_frame;
if (line6pcm->out.pos_done >= runtime->buffer_size) if (line6pcm->out.pos_done >= runtime->buffer_size)
line6pcm->out.pos_done -= runtime->buffer_size; line6pcm->out.pos_done -= runtime->buffer_size;
......
...@@ -83,7 +83,6 @@ struct usb_line6_pod { ...@@ -83,7 +83,6 @@ struct usb_line6_pod {
}; };
#define POD_SYSEX_CODE 3 #define POD_SYSEX_CODE 3
#define POD_BYTES_PER_FRAME 6 /* 24bit audio (stereo) */
/* *INDENT-OFF* */ /* *INDENT-OFF* */
...@@ -167,7 +166,7 @@ static struct line6_pcm_properties pod_pcm_properties = { ...@@ -167,7 +166,7 @@ static struct line6_pcm_properties pod_pcm_properties = {
.rates = { .rates = {
.nrats = 1, .nrats = 1,
.rats = &pod_ratden}, .rats = &pod_ratden},
.bytes_per_frame = POD_BYTES_PER_FRAME .bytes_per_channel = 3 /* SNDRV_PCM_FMTBIT_S24_3LE */
}; };
static const char pod_version_header[] = { static const char pod_version_header[] = {
......
...@@ -25,8 +25,6 @@ enum { ...@@ -25,8 +25,6 @@ enum {
LINE6_PODHD500_1, LINE6_PODHD500_1,
}; };
#define PODHD_BYTES_PER_FRAME 6 /* 24bit audio (stereo) */
static struct snd_ratden podhd_ratden = { static struct snd_ratden podhd_ratden = {
.num_min = 48000, .num_min = 48000,
.num_max = 48000, .num_max = 48000,
...@@ -73,7 +71,7 @@ static struct line6_pcm_properties podhd_pcm_properties = { ...@@ -73,7 +71,7 @@ static struct line6_pcm_properties podhd_pcm_properties = {
.rates = { .rates = {
.nrats = 1, .nrats = 1,
.rats = &podhd_ratden}, .rats = &podhd_ratden},
.bytes_per_frame = PODHD_BYTES_PER_FRAME .bytes_per_channel = 3 /* 24bit audio (stereo) */
}; };
/* /*
......
...@@ -114,7 +114,7 @@ static struct line6_pcm_properties toneport_pcm_properties = { ...@@ -114,7 +114,7 @@ static struct line6_pcm_properties toneport_pcm_properties = {
.rates = { .rates = {
.nrats = 1, .nrats = 1,
.rats = &toneport_ratden}, .rats = &toneport_ratden},
.bytes_per_frame = 4 .bytes_per_channel = 2
}; };
static const struct { static const struct {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment