ALSA: line6: Allow different channel numbers for in/out
[cascardo/linux.git] / sound / usb / line6 / playback.c
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;