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);
408 struct gus_pcm_private *pcmp = runtime->private_data;
412 bpos = get_bpos(pcmp, voice, pos, len);
425 struct gus_pcm_private *pcmp = runtime->private_data;
429 if (pcmp->memory > 0) {
430 snd_gf1_mem_free(&gus->gf1.mem_alloc, pcmp->memory);
431 pcmp->memory = 0;
439 pcmp->memory = block->ptr;
441 pcmp->voices = params_channels(hw_params);
442 if (pcmp->pvoices[0] == NULL) {
443 if ((pcmp->pvoices[0] = snd_gf1_alloc_voice(pcmp->gus, SNDRV_GF1_VOICE_TYPE_PCM, 0, 0)) == NULL)
445 pcmp->pvoices[0]->handler_wave = snd_gf1_pcm_interrupt_wave;
446 pcmp->pvoices[0]->handler_volume = snd_gf1_pcm_interrupt_volume;
447 pcmp->pvoices[0]->volume_change = snd_gf1_pcm_volume_change;
448 pcmp->pvoices[0]->private_data = pcmp;
450 if (pcmp->voices > 1 && pcmp->pvoices[1] == NULL) {
451 if ((pcmp->pvoices[1] = snd_gf1_alloc_voice(pcmp->gus, SNDRV_GF1_VOICE_TYPE_PCM, 0, 0)) == NULL)
453 pcmp->pvoices[1]->handler_wave = snd_gf1_pcm_interrupt_wave;
454 pcmp->pvoices[1]->handler_volume = snd_gf1_pcm_interrupt_volume;
455 pcmp->pvoices[1]->volume_change = snd_gf1_pcm_volume_change;
456 pcmp->pvoices[1]->private_data = pcmp;
457 } else if (pcmp->voices == 1) {
458 if (pcmp->pvoices[1]) {
459 snd_gf1_free_voice(pcmp->gus, pcmp->pvoices[1]);
460 pcmp->pvoices[1] = NULL;
469 struct gus_pcm_private *pcmp = runtime->private_data;
471 if (pcmp->pvoices[0]) {
472 snd_gf1_free_voice(pcmp->gus, pcmp->pvoices[0]);
473 pcmp->pvoices[0] = NULL;
475 if (pcmp->pvoices[1]) {
476 snd_gf1_free_voice(pcmp->gus, pcmp->pvoices[1]);
477 pcmp->pvoices[1] = NULL;
479 if (pcmp->memory > 0) {
480 snd_gf1_mem_free(&pcmp->gus->gf1.mem_alloc, pcmp->memory);
481 pcmp->memory = 0;
489 struct gus_pcm_private *pcmp = runtime->private_data;
491 pcmp->bpos = 0;
492 pcmp->dma_size = snd_pcm_lib_buffer_bytes(substream);
493 pcmp->block_size = snd_pcm_lib_period_bytes(substream);
494 pcmp->blocks = pcmp->dma_size / pcmp->block_size;
503 struct gus_pcm_private *pcmp = runtime->private_data;
509 spin_lock(&pcmp->lock);
510 pcmp->flags &= ~SNDRV_GF1_PCM_PFLG_ACTIVE;
511 spin_unlock(&pcmp->lock);
512 voice = pcmp->pvoices[0]->number;
514 if (pcmp->pvoices[1]) {
515 voice = pcmp->pvoices[1]->number;
528 struct gus_pcm_private *pcmp = runtime->private_data;
534 if (pcmp->flags & SNDRV_GF1_PCM_PFLG_ACTIVE) {
535 snd_gf1_select_voice(gus, pcmp->pvoices[0]->number);
537 pos = (snd_gf1_read_addr(gus, SNDRV_GF1_VA_CURRENT, voice_ctrl & 4) >> 4) - pcmp->memory;
672 struct gus_pcm_private *pcmp;
677 pcmp = kzalloc(sizeof(*pcmp), GFP_KERNEL);
678 if (pcmp == NULL)
680 pcmp->gus = gus;
681 spin_lock_init(&pcmp->lock);
682 init_waitqueue_head(&pcmp->sleep);
683 atomic_set(&pcmp->dma_count, 0);
685 runtime->private_data = pcmp;
694 pcmp->flags = SNDRV_GF1_PCM_PFLG_NONE;
695 pcmp->substream = substream;
707 struct gus_pcm_private *pcmp = runtime->private_data;
709 if (!wait_event_timeout(pcmp->sleep, (atomic_read(&pcmp->dma_count) <= 0), 2*HZ))
768 struct gus_pcm_private *pcmp;
787 pcmp = pvoice->private_data;
788 if (!(pcmp->flags & SNDRV_GF1_PCM_PFLG_ACTIVE))
794 vol = pvoice == pcmp->pvoices[0] ? gus->gf1.pcm_volume_level_left : gus->gf1.pcm_volume_level_right;
796 pcmp->final_volume = 1;