int snd_emu10k1_memblk_map(struct snd_emu10k1 *emu, struct snd_emu10k1_memblk *blk);
 
 /* voice allocation */
-int snd_emu10k1_voice_alloc(struct snd_emu10k1 *emu, int type, int pair, struct snd_emu10k1_voice **rvoice);
+int snd_emu10k1_voice_alloc(struct snd_emu10k1 *emu, int type, int pair,
+                           struct snd_emu10k1_pcm *epcm, struct snd_emu10k1_voice **rvoice);
 int snd_emu10k1_voice_free(struct snd_emu10k1 *emu, struct snd_emu10k1_voice *pvoice);
 
 /* MIDI uart */
 
                        if (vp->ch < 0) {
                                /* allocate a voice */
                                struct snd_emu10k1_voice *hwvoice;
-                               if (snd_emu10k1_voice_alloc(hw, EMU10K1_SYNTH, 1, &hwvoice) < 0 || hwvoice == NULL)
+                               if (snd_emu10k1_voice_alloc(hw, EMU10K1_SYNTH, 1, NULL, &hwvoice) < 0 || hwvoice == NULL)
                                        continue;
                                vp->ch = hwvoice->number;
                                emu->num_voices++;
 
        err = snd_emu10k1_voice_alloc(epcm->emu,
                                      epcm->type == PLAYBACK_EMUVOICE ? EMU10K1_PCM : EMU10K1_EFX,
                                      voices,
-                                     &epcm->voices[0]);
+                                     epcm, &epcm->voices[0]);
        
        if (err < 0)
                return err;
-       epcm->voices[0]->epcm = epcm;
        if (voices > 1) {
                for (i = 1; i < voices; i++) {
                        epcm->voices[i] = &epcm->emu->voices[(epcm->voices[0]->number + i) % NUM_G];
-                       epcm->voices[i]->epcm = epcm;
                }
        }
        if (epcm->extra == NULL) {
                err = snd_emu10k1_voice_alloc(epcm->emu,
                                              epcm->type == PLAYBACK_EMUVOICE ? EMU10K1_PCM_IRQ : EMU10K1_EFX_IRQ,
                                              1,
-                                             &epcm->extra);
+                                             epcm, &epcm->extra);
                if (err < 0) {
                        /*
                        dev_dbg(emu->card->dev, "pcm_channel_alloc: "
                        snd_emu10k1_pcm_free_voices(epcm);
                        return err;
                }
-               epcm->extra->epcm = epcm;
                epcm->extra->interrupt = snd_emu10k1_pcm_interrupt;
        }
 
 
  */
 
 static int voice_alloc(struct snd_emu10k1 *emu, int type, int number,
-                      struct snd_emu10k1_voice **rvoice)
+                      struct snd_emu10k1_pcm *epcm, struct snd_emu10k1_voice **rvoice)
 {
        struct snd_emu10k1_voice *voice;
        int i, j, k, first_voice, last_voice, skip;
                       voice->number, idx-first_voice+1, number);
                */
                voice->use = type;
+               voice->epcm = epcm;
        }
        *rvoice = &emu->voices[first_voice];
        return 0;
 }
 
 int snd_emu10k1_voice_alloc(struct snd_emu10k1 *emu, int type, int number,
-                           struct snd_emu10k1_voice **rvoice)
+                           struct snd_emu10k1_pcm *epcm, struct snd_emu10k1_voice **rvoice)
 {
        unsigned long flags;
        int result;
 
        spin_lock_irqsave(&emu->voice_lock, flags);
        for (;;) {
-               result = voice_alloc(emu, type, number, rvoice);
+               result = voice_alloc(emu, type, number, epcm, rvoice);
                if (result == 0 || type == EMU10K1_SYNTH)
                        break;