summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--sound/usb/line6/capture.c6
-rw-r--r--sound/usb/line6/capture.h1
-rw-r--r--sound/usb/line6/pcm.c53
-rw-r--r--sound/usb/line6/playback.c6
-rw-r--r--sound/usb/line6/playback.h1
5 files changed, 29 insertions, 38 deletions
diff --git a/sound/usb/line6/capture.c b/sound/usb/line6/capture.c
index 1d477d7..47cfcc2 100644
--- a/sound/usb/line6/capture.c
+++ b/sound/usb/line6/capture.c
@@ -141,12 +141,6 @@ void line6_capture_check_period(struct snd_line6_pcm *line6pcm, int length)
}
}
-void line6_free_capture_buffer(struct snd_line6_pcm *line6pcm)
-{
- kfree(line6pcm->in.buffer);
- line6pcm->in.buffer = NULL;
-}
-
/*
* Callback for completed capture URB.
*/
diff --git a/sound/usb/line6/capture.h b/sound/usb/line6/capture.h
index 3cc71bc..db062e7 100644
--- a/sound/usb/line6/capture.h
+++ b/sound/usb/line6/capture.h
@@ -24,7 +24,6 @@ extern void line6_capture_copy(struct snd_line6_pcm *line6pcm, char *fbuf,
extern void line6_capture_check_period(struct snd_line6_pcm *line6pcm,
int length);
extern int line6_create_audio_in_urbs(struct snd_line6_pcm *line6pcm);
-extern void line6_free_capture_buffer(struct snd_line6_pcm *line6pcm);
extern int line6_submit_audio_in_all_urbs(struct snd_line6_pcm *line6pcm);
extern int snd_line6_capture_trigger(struct snd_line6_pcm *line6pcm, int cmd);
diff --git a/sound/usb/line6/pcm.c b/sound/usb/line6/pcm.c
index 4152d92..f758259 100644
--- a/sound/usb/line6/pcm.c
+++ b/sound/usb/line6/pcm.c
@@ -132,6 +132,27 @@ static void line6_wait_clear_audio_urbs(struct snd_line6_pcm *line6pcm,
"timeout: still %d active urbs..\n", alive);
}
+static int line6_alloc_stream_buffer(struct snd_line6_pcm *line6pcm,
+ struct line6_pcm_stream *pcms)
+{
+ /* Invoked multiple times in a row so allocate once only */
+ if (pcms->buffer)
+ return 0;
+
+ pcms->buffer = kmalloc(LINE6_ISO_BUFFERS * LINE6_ISO_PACKETS *
+ line6pcm->max_packet_size, GFP_KERNEL);
+ if (!pcms->buffer)
+ return -ENOMEM;
+ return 0;
+}
+
+static void line6_free_stream_buffer(struct snd_line6_pcm *line6pcm,
+ struct line6_pcm_stream *pcms)
+{
+ kfree(pcms->buffer);
+ pcms->buffer = NULL;
+}
+
static bool test_flags(unsigned long flags0, unsigned long flags1,
unsigned long mask)
{
@@ -153,17 +174,9 @@ int line6_pcm_acquire(struct snd_line6_pcm *line6pcm, int channels)
line6pcm->prev_fbuf = NULL;
if (test_flags(flags_old, flags_new, LINE6_BITS_CAPTURE_BUFFER)) {
- /* Invoked multiple times in a row so allocate once only */
- if (!line6pcm->in.buffer) {
- line6pcm->in.buffer =
- kmalloc(LINE6_ISO_BUFFERS * LINE6_ISO_PACKETS *
- line6pcm->max_packet_size, GFP_KERNEL);
- if (!line6pcm->in.buffer) {
- err = -ENOMEM;
- goto pcm_acquire_error;
- }
- }
-
+ err = line6_alloc_stream_buffer(line6pcm, &line6pcm->in);
+ if (err < 0)
+ goto pcm_acquire_error;
flags_final |= channels & LINE6_BITS_CAPTURE_BUFFER;
}
@@ -190,17 +203,9 @@ int line6_pcm_acquire(struct snd_line6_pcm *line6pcm, int channels)
}
if (test_flags(flags_old, flags_new, LINE6_BITS_PLAYBACK_BUFFER)) {
- /* Invoked multiple times in a row so allocate once only */
- if (!line6pcm->out.buffer) {
- line6pcm->out.buffer =
- kmalloc(LINE6_ISO_BUFFERS * LINE6_ISO_PACKETS *
- line6pcm->max_packet_size, GFP_KERNEL);
- if (!line6pcm->out.buffer) {
- err = -ENOMEM;
- goto pcm_acquire_error;
- }
- }
-
+ err = line6_alloc_stream_buffer(line6pcm, &line6pcm->out);
+ if (err < 0)
+ goto pcm_acquire_error;
flags_final |= channels & LINE6_BITS_PLAYBACK_BUFFER;
}
@@ -248,7 +253,7 @@ int line6_pcm_release(struct snd_line6_pcm *line6pcm, int channels)
if (test_flags(flags_new, flags_old, LINE6_BITS_CAPTURE_BUFFER)) {
line6_wait_clear_audio_urbs(line6pcm, &line6pcm->in);
- line6_free_capture_buffer(line6pcm);
+ line6_free_stream_buffer(line6pcm, &line6pcm->in);
}
if (test_flags(flags_new, flags_old, LINE6_BITS_PLAYBACK_STREAM))
@@ -256,7 +261,7 @@ int line6_pcm_release(struct snd_line6_pcm *line6pcm, int channels)
if (test_flags(flags_new, flags_old, LINE6_BITS_PLAYBACK_BUFFER)) {
line6_wait_clear_audio_urbs(line6pcm, &line6pcm->out);
- line6_free_playback_buffer(line6pcm);
+ line6_free_stream_buffer(line6pcm, &line6pcm->out);
}
return 0;
diff --git a/sound/usb/line6/playback.c b/sound/usb/line6/playback.c
index 3820ed0..750d91d 100644
--- a/sound/usb/line6/playback.c
+++ b/sound/usb/line6/playback.c
@@ -290,12 +290,6 @@ int line6_submit_audio_out_all_urbs(struct snd_line6_pcm *line6pcm)
return 0;
}
-void line6_free_playback_buffer(struct snd_line6_pcm *line6pcm)
-{
- kfree(line6pcm->out.buffer);
- line6pcm->out.buffer = NULL;
-}
-
/*
Callback for completed playback URB.
*/
diff --git a/sound/usb/line6/playback.h b/sound/usb/line6/playback.h
index 52a2783..f6a9e18 100644
--- a/sound/usb/line6/playback.h
+++ b/sound/usb/line6/playback.h
@@ -30,7 +30,6 @@
extern struct snd_pcm_ops snd_line6_playback_ops;
extern int line6_create_audio_out_urbs(struct snd_line6_pcm *line6pcm);
-extern void line6_free_playback_buffer(struct snd_line6_pcm *line6pcm);
extern int line6_submit_audio_out_all_urbs(struct snd_line6_pcm *line6pcm);
extern int snd_line6_playback_trigger(struct snd_line6_pcm *line6pcm, int cmd);