Skip to content

Commit

Permalink
ALSA: line6: Allow different channel numbers for in/out
Browse files Browse the repository at this point in the history
Changes bytes_per_frame to bytes_per_channel.

Signed-off-by: Andrej Krutak <[email protected]>
Signed-off-by: Takashi Iwai <[email protected]>
  • Loading branch information
andree182 authored and tiwai committed Sep 19, 2016
1 parent 7a0f55a commit 97d78ac
Show file tree
Hide file tree
Showing 7 changed files with 22 additions and 13 deletions.
8 changes: 6 additions & 2 deletions sound/usb/line6/capture.c
Original file line number Diff line number Diff line change
Expand Up @@ -90,7 +90,9 @@ void line6_capture_copy(struct snd_line6_pcm *line6pcm, char *fbuf, int fsize)
struct snd_pcm_substream *substream =
get_substream(line6pcm, SNDRV_PCM_STREAM_CAPTURE);
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;

if (runtime == NULL)
Expand Down Expand Up @@ -191,7 +193,9 @@ static void audio_in_callback(struct urb *urb)
*/

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) &&
test_bit(LINE6_STREAM_PCM, &line6pcm->in.running) &&
Expand Down
2 changes: 1 addition & 1 deletion sound/usb/line6/driver.h
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,7 @@
#define LINE6_FALLBACK_MAXPACKETSIZE 16

#define LINE6_TIMEOUT 1
#define LINE6_BUFSIZE_LISTEN 32
#define LINE6_BUFSIZE_LISTEN 64
#define LINE6_MESSAGE_MAXLEN 256

/*
Expand Down
2 changes: 1 addition & 1 deletion sound/usb/line6/pcm.h
Original file line number Diff line number Diff line change
Expand Up @@ -84,7 +84,7 @@ enum {
struct line6_pcm_properties {
struct snd_pcm_hardware playback_hw, capture_hw;
struct snd_pcm_hw_constraint_ratdens rates;
int bytes_per_frame;
int bytes_per_channel;
};

struct line6_pcm_stream {
Expand Down
14 changes: 11 additions & 3 deletions sound/usb/line6/playback.c
Original file line number Diff line number Diff line change
Expand Up @@ -146,7 +146,9 @@ static int submit_audio_out_urb(struct snd_line6_pcm *line6pcm)
int index;
int i, urb_size, urb_frames;
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 =
line6pcm->properties->rates.rats[0].num_min;
const int frame_factor =
Expand All @@ -165,6 +167,7 @@ static int submit_audio_out_urb(struct snd_line6_pcm *line6pcm)
urb_out = line6pcm->out.urbs[index];
urb_size = 0;

/* TODO: this may not work for LINE6_ISO_PACKETS != 1 */
for (i = 0; i < LINE6_ISO_PACKETS; ++i) {
/* compute frame size for given sampling rate */
int fsize = 0;
Expand All @@ -178,9 +181,11 @@ static int submit_audio_out_urb(struct snd_line6_pcm *line6pcm)
line6pcm->out.count += frame_increment;
n = line6pcm->out.count / frame_factor;
line6pcm->out.count -= n * frame_factor;
fsize = n * bytes_per_frame;
fsize = n;
}

fsize *= bytes_per_frame;

fout->offset = urb_size;
fout->length = fsize;
urb_size += fsize;
Expand Down Expand Up @@ -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_pcm_substream *substream =
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
memset(urb->transfer_buffer, 0, urb->transfer_buffer_length);
Expand All @@ -329,7 +337,7 @@ static void audio_out_callback(struct urb *urb)
struct snd_pcm_runtime *runtime = substream->runtime;

line6pcm->out.pos_done +=
length / line6pcm->properties->bytes_per_frame;
length / bytes_per_frame;

if (line6pcm->out.pos_done >= runtime->buffer_size)
line6pcm->out.pos_done -= runtime->buffer_size;
Expand Down
3 changes: 1 addition & 2 deletions sound/usb/line6/pod.c
Original file line number Diff line number Diff line change
Expand Up @@ -83,7 +83,6 @@ struct usb_line6_pod {
};

#define POD_SYSEX_CODE 3
#define POD_BYTES_PER_FRAME 6 /* 24bit audio (stereo) */

/* *INDENT-OFF* */

Expand Down Expand Up @@ -167,7 +166,7 @@ static struct line6_pcm_properties pod_pcm_properties = {
.rates = {
.nrats = 1,
.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[] = {
Expand Down
4 changes: 1 addition & 3 deletions sound/usb/line6/podhd.c
Original file line number Diff line number Diff line change
Expand Up @@ -25,8 +25,6 @@ enum {
LINE6_PODHD500_1,
};

#define PODHD_BYTES_PER_FRAME 6 /* 24bit audio (stereo) */

static struct snd_ratden podhd_ratden = {
.num_min = 48000,
.num_max = 48000,
Expand Down Expand Up @@ -73,7 +71,7 @@ static struct line6_pcm_properties podhd_pcm_properties = {
.rates = {
.nrats = 1,
.rats = &podhd_ratden},
.bytes_per_frame = PODHD_BYTES_PER_FRAME
.bytes_per_channel = 3 /* 24bit audio (stereo) */
};

/*
Expand Down
2 changes: 1 addition & 1 deletion sound/usb/line6/toneport.c
Original file line number Diff line number Diff line change
Expand Up @@ -114,7 +114,7 @@ static struct line6_pcm_properties toneport_pcm_properties = {
.rates = {
.nrats = 1,
.rats = &toneport_ratden},
.bytes_per_frame = 4
.bytes_per_channel = 2
};

static const struct {
Expand Down

0 comments on commit 97d78ac

Please sign in to comment.