/* Function: al_detach_voice */ void al_detach_voice(ALLEGRO_VOICE *voice) { ASSERT(voice); if (!voice->attached_stream) { return; } al_lock_mutex(voice->mutex); if (!voice->is_streaming) { ALLEGRO_SAMPLE_INSTANCE *spl = voice->attached_stream; spl->pos = al_get_voice_position(voice); spl->pos <<= MIXER_FRAC_SHIFT; spl->is_playing = al_get_voice_playing(voice); voice->driver->stop_voice(voice); voice->driver->unload_voice(voice); } else { voice->driver->stop_voice(voice); } _al_kcm_stream_set_mutex(voice->attached_stream, NULL); voice->attached_stream->parent.u.voice = NULL; voice->attached_stream = NULL; al_unlock_mutex(voice->mutex); }
/* Function: al_get_sample_instance_position */ unsigned int al_get_sample_instance_position(const ALLEGRO_SAMPLE_INSTANCE *spl) { ASSERT(spl); if (spl->parent.u.ptr && spl->parent.is_voice) { ALLEGRO_VOICE *voice = spl->parent.u.voice; return al_get_voice_position(voice); } return spl->pos; }