|
@@ -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;
|