--- 9b9931fffcc8560744248bbe7b65ead0b8e34a05 +++ 23a75117124f1b2cd9c503a0951eda0d35b1746c @@ -22,9 +22,11 @@ #include #define SAMPLE_RATE 44100 +/* Each frame is two 16 bit integers (one per channel) */ +#define BYTES_PER_FRAME 4 #define FRAMES_PER_MSEC (SAMPLE_RATE / 1000) -#define IN_EP_MAX_PACKET_SIZE 384 +#define IN_EP_MAX_PACKET_SIZE 256 /* Number of requests to allocate */ #define IN_EP_REQ_COUNT 4 @@ -243,7 +245,8 @@ struct audio_dev { struct list_head idle_reqs; struct usb_ep *in_ep; - struct usb_endpoint_descriptor *in_desc; + struct usb_endpoint_descriptor *in_desc; + spinlock_t lock; /* beginning, end and current position in our buffer */ @@ -411,7 +414,7 @@ static void audio_data_complete(struct u audio_req_put(audio, req); - if (!audio->buffer_start || req->status) + if (!audio->buffer_start) return; audio->period_offset += req->actual; @@ -619,10 +622,7 @@ audio_unbind(struct usb_configuration *c audio_request_free(req, audio->in_ep); snd_card_free_when_closed(audio->card); - audio->card = NULL; - audio->pcm = NULL; - audio->substream = NULL; - audio->in_ep = NULL; + kfree(audio); } static void audio_pcm_playback_start(struct audio_dev *audio) @@ -738,22 +738,6 @@ static int audio_pcm_playback_trigger(st return ret; } -static struct audio_dev _audio_dev = { - .func = { - .name = "audio_source", - .bind = audio_bind, - .unbind = audio_unbind, - .set_alt = audio_set_alt, - .setup = audio_setup, - .disable = audio_disable, - .descriptors = fs_audio_desc, - .hs_descriptors = hs_audio_desc, - }, - .in_desc = &fs_as_in_ep_desc, - .lock = __SPIN_LOCK_UNLOCKED(_audio_dev.lock), - .idle_reqs = LIST_HEAD_INIT(_audio_dev.idle_reqs), -}; - static struct snd_pcm_ops audio_playback_ops = { .open = audio_pcm_open, .close = audio_pcm_close, @@ -776,12 +760,27 @@ int audio_source_bind_config(struct usb_ config->card = -1; config->device = -1; - audio = &_audio_dev; + audio = kzalloc(sizeof *audio, GFP_KERNEL); + if (!audio) + return -ENOMEM; + + audio->func.name = "audio_source"; + + spin_lock_init(&audio->lock); + + audio->func.bind = audio_bind; + audio->func.unbind = audio_unbind; + audio->func.set_alt = audio_set_alt; + audio->func.setup = audio_setup; + audio->func.disable = audio_disable; + audio->in_desc = &fs_as_in_ep_desc; + + INIT_LIST_HEAD(&audio->idle_reqs); err = snd_card_create(SNDRV_DEFAULT_IDX1, SNDRV_DEFAULT_STR1, THIS_MODULE, 0, &card); if (err) - return err; + goto snd_card_fail; snd_card_set_dev(card, &c->cdev->gadget->dev); @@ -820,5 +819,7 @@ add_fail: register_fail: pcm_fail: snd_card_free(audio->card); +snd_card_fail: + kfree(audio); return err; }