OSDN Git Service

ALSA: line6: Allow different channel numbers for in/out
authorAndrej Krutak <dev@andree.sk>
Sun, 18 Sep 2016 18:59:24 +0000 (20:59 +0200)
committerTakashi Iwai <tiwai@suse.de>
Mon, 19 Sep 2016 21:00:16 +0000 (23:00 +0200)
Changes bytes_per_frame to bytes_per_channel.

Signed-off-by: Andrej Krutak <dev@andree.sk>
Signed-off-by: Takashi Iwai <tiwai@suse.de>
sound/usb/line6/capture.c
sound/usb/line6/driver.h
sound/usb/line6/pcm.h
sound/usb/line6/playback.c
sound/usb/line6/pod.c
sound/usb/line6/podhd.c
sound/usb/line6/toneport.c

index 8f96478..0228cb4 100644 (file)
@@ -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)
@@ -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) &&
index a55eb88..2d32139 100644 (file)
@@ -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
 
 /*
index f040c81..67fda31 100644 (file)
@@ -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 {
index 08bacf3..812d181 100644 (file)
@@ -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 =
@@ -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;
@@ -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;
@@ -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);
@@ -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;
index 45dd348..36e7274 100644 (file)
@@ -83,7 +83,6 @@ struct usb_line6_pod {
 };
 
 #define POD_SYSEX_CODE 3
-#define POD_BYTES_PER_FRAME 6  /* 24bit audio (stereo) */
 
 /* *INDENT-OFF* */
 
@@ -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[] = {
index 63dcaef..4fc4789 100644 (file)
@@ -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,
@@ -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) */
 };
 
 /*
index 6d4c50c..da76e03 100644 (file)
@@ -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 {