Lines Matching refs:pcmp

51 	struct gus_pcm_private *pcmp = private_data;
53 if (pcmp) {
54 atomic_dec(&pcmp->dma_count);
55 wake_up(&pcmp->sleep);
66 struct gus_pcm_private *pcmp = runtime->private_data;
84 block.private_data = pcmp;
86 if (!snd_gf1_dma_transfer_block(pcmp->gus, &block, 0, 0))
87 atomic_inc(&pcmp->dma_count);
94 struct gus_pcm_private *pcmp = runtime->private_data;
95 struct snd_gus_card * gus = pcmp->gus;
104 spin_lock_irqsave(&pcmp->lock, flags);
105 if (pcmp->flags & SNDRV_GF1_PCM_PFLG_ACTIVE) {
106 spin_unlock_irqrestore(&pcmp->lock, flags);
109 pcmp->flags |= SNDRV_GF1_PCM_PFLG_ACTIVE;
110 pcmp->final_volume = 0;
111 spin_unlock_irqrestore(&pcmp->lock, flags);
117 if (pcmp->blocks == 1) {
121 for (voice = 0; voice < pcmp->voices; voice++) {
122 begin = pcmp->memory + voice * (pcmp->dma_size / runtime->channels);
123 curr = begin + (pcmp->bpos * pcmp->block_size) / runtime->channels;
124 end = curr + (pcmp->block_size / runtime->channels);
134 snd_gf1_select_voice(gus, pcmp->pvoices[voice]->number);
152 for (voice = 0; voice < pcmp->voices; voice++) {
153 snd_gf1_select_voice(gus, pcmp->pvoices[voice]->number);
162 for (voice = 0; voice < pcmp->voices; voice++) {
163 snd_gf1_select_voice(gus, pcmp->pvoices[voice]->number);
174 struct gus_pcm_private * pcmp;
185 pcmp = pvoice->private_data;
186 if (pcmp == NULL) {
191 gus = pcmp->gus;
192 runtime = pcmp->substream->runtime;
202 snd_gf1_select_voice(gus, pcmp->pvoices[1]->number);
207 pcmp->bpos++;
208 pcmp->bpos %= pcmp->blocks;
209 if (pcmp->bpos + 1 >= pcmp->blocks) { /* last block? */
214 end = pcmp->memory + (((pcmp->bpos + 1) * pcmp->block_size) / runtime->channels);
216 step = pcmp->dma_size / runtime->channels;
218 if (!pcmp->final_volume) {
222 for (idx = 0; idx < pcmp->voices; idx++, end += step) {
223 snd_gf1_select_voice(gus, pcmp->pvoices[idx]->number);
232 for (idx = 0; idx < pcmp->voices; idx++) {
233 snd_gf1_select_voice(gus, pcmp->pvoices[idx]->number);
241 snd_pcm_period_elapsed(pcmp->substream);
245 end = pcmp->bpos * pcmp->block_size;
247 snd_gf1_pcm_block_change(pcmp->substream, end, pcmp->memory + (end / 2), pcmp->block_size / 2);
248 snd_gf1_pcm_block_change(pcmp->substream, end + (pcmp->block_size / 2), pcmp->memory + (pcmp->dma_size / 2) + (end / 2), pcmp->block_size / 2);
250 snd_gf1_pcm_block_change(pcmp->substream, end, pcmp->memory + end, pcmp->block_size);
261 struct gus_pcm_private *pcmp = pvoice->private_data;
268 if (pcmp == NULL)
271 if (!(pcmp->flags & SNDRV_GF1_PCM_PFLG_ACTIVE))
274 cvoice = pcmp->pvoices[0] == pvoice ? 0 : 1;
275 if (pcmp->substream == NULL)
281 pcmp->final_volume = 1;
341 static int get_bpos(struct gus_pcm_private *pcmp, int voice, unsigned int pos,
344 unsigned int bpos = pos + (voice * (pcmp->dma_size / 2));
345 if (snd_BUG_ON(bpos > pcmp->dma_size))
347 if (snd_BUG_ON(bpos + len > pcmp->dma_size))
356 struct gus_pcm_private *pcmp = runtime->private_data;
357 struct snd_gus_card *gus = pcmp->gus;
362 pcmp->memory + bpos, len);
367 pcmp->memory + bpos, len, w16, invert);
375 struct gus_pcm_private *pcmp = runtime->private_data;
379 bpos = get_bpos(pcmp, voice, pos, len);
392 struct gus_pcm_private *pcmp = runtime->private_data;
396 bpos = get_bpos(pcmp, voice, pos, len);
409 struct gus_pcm_private *pcmp = runtime->private_data;
413 if (pcmp->memory > 0) {
414 snd_gf1_mem_free(&gus->gf1.mem_alloc, pcmp->memory);
415 pcmp->memory = 0;
424 pcmp->memory = block->ptr;
426 pcmp->voices = params_channels(hw_params);
427 if (pcmp->pvoices[0] == NULL) {
428 pcmp->pvoices[0] = snd_gf1_alloc_voice(pcmp->gus, SNDRV_GF1_VOICE_TYPE_PCM, 0, 0);
429 if (!pcmp->pvoices[0])
431 pcmp->pvoices[0]->handler_wave = snd_gf1_pcm_interrupt_wave;
432 pcmp->pvoices[0]->handler_volume = snd_gf1_pcm_interrupt_volume;
433 pcmp->pvoices[0]->volume_change = snd_gf1_pcm_volume_change;
434 pcmp->pvoices[0]->private_data = pcmp;
436 if (pcmp->voices > 1 && pcmp->pvoices[1] == NULL) {
437 pcmp->pvoices[1] = snd_gf1_alloc_voice(pcmp->gus, SNDRV_GF1_VOICE_TYPE_PCM, 0, 0);
438 if (!pcmp->pvoices[1])
440 pcmp->pvoices[1]->handler_wave = snd_gf1_pcm_interrupt_wave;
441 pcmp->pvoices[1]->handler_volume = snd_gf1_pcm_interrupt_volume;
442 pcmp->pvoices[1]->volume_change = snd_gf1_pcm_volume_change;
443 pcmp->pvoices[1]->private_data = pcmp;
444 } else if (pcmp->voices == 1) {
445 if (pcmp->pvoices[1]) {
446 snd_gf1_free_voice(pcmp->gus, pcmp->pvoices[1]);
447 pcmp->pvoices[1] = NULL;
456 struct gus_pcm_private *pcmp = runtime->private_data;
458 if (pcmp->pvoices[0]) {
459 snd_gf1_free_voice(pcmp->gus, pcmp->pvoices[0]);
460 pcmp->pvoices[0] = NULL;
462 if (pcmp->pvoices[1]) {
463 snd_gf1_free_voice(pcmp->gus, pcmp->pvoices[1]);
464 pcmp->pvoices[1] = NULL;
466 if (pcmp->memory > 0) {
467 snd_gf1_mem_free(&pcmp->gus->gf1.mem_alloc, pcmp->memory);
468 pcmp->memory = 0;
476 struct gus_pcm_private *pcmp = runtime->private_data;
478 pcmp->bpos = 0;
479 pcmp->dma_size = snd_pcm_lib_buffer_bytes(substream);
480 pcmp->block_size = snd_pcm_lib_period_bytes(substream);
481 pcmp->blocks = pcmp->dma_size / pcmp->block_size;
490 struct gus_pcm_private *pcmp = runtime->private_data;
496 spin_lock(&pcmp->lock);
497 pcmp->flags &= ~SNDRV_GF1_PCM_PFLG_ACTIVE;
498 spin_unlock(&pcmp->lock);
499 voice = pcmp->pvoices[0]->number;
501 if (pcmp->pvoices[1]) {
502 voice = pcmp->pvoices[1]->number;
515 struct gus_pcm_private *pcmp = runtime->private_data;
521 if (pcmp->flags & SNDRV_GF1_PCM_PFLG_ACTIVE) {
522 snd_gf1_select_voice(gus, pcmp->pvoices[0]->number);
524 pos = (snd_gf1_read_addr(gus, SNDRV_GF1_VA_CURRENT, voice_ctrl & 4) >> 4) - pcmp->memory;
659 struct gus_pcm_private *pcmp;
664 pcmp = kzalloc(sizeof(*pcmp), GFP_KERNEL);
665 if (pcmp == NULL)
667 pcmp->gus = gus;
668 spin_lock_init(&pcmp->lock);
669 init_waitqueue_head(&pcmp->sleep);
670 atomic_set(&pcmp->dma_count, 0);
672 runtime->private_data = pcmp;
682 pcmp->flags = SNDRV_GF1_PCM_PFLG_NONE;
683 pcmp->substream = substream;
695 struct gus_pcm_private *pcmp = runtime->private_data;
697 if (!wait_event_timeout(pcmp->sleep, (atomic_read(&pcmp->dma_count) <= 0), 2*HZ))
756 struct gus_pcm_private *pcmp;
775 pcmp = pvoice->private_data;
776 if (!(pcmp->flags & SNDRV_GF1_PCM_PFLG_ACTIVE))
782 vol = pvoice == pcmp->pvoices[0] ? gus->gf1.pcm_volume_level_left : gus->gf1.pcm_volume_level_right;
784 pcmp->final_volume = 1;