/** Start a compressed sound channel */ static glui32 play_compressed(schanid_t chan, char *ext) { SDL_LockAudio(); chan->status = CHANNEL_SOUND; chan->buffered = 1; chan->sdl_channel = Mix_GroupAvailable(FREE); Mix_GroupChannel(chan->sdl_channel, BUSY); SDL_UnlockAudio(); chan->decode = Sound_NewSample(chan->sdl_rwops, ext, output, 65536); Uint32 soundbytes = Sound_Decode(chan->decode); Sound_Sample *sample = chan->decode; chan->sample = Mix_QuickLoad_RAW(sample->buffer, soundbytes); if (chan->sdl_channel < 0) gli_strict_warning("No available sound channels"); if (chan->sdl_channel >= 0 && chan->sample) { SDL_LockAudio(); sound_channels[chan->sdl_channel] = chan; SDL_UnlockAudio(); Mix_Volume(chan->sdl_channel, chan->volume); Mix_ChannelFinished(&sound_completion_callback); if (Mix_PlayChannel(chan->sdl_channel, chan->sample, 0) >= 0) return 1; } gli_strict_warning("play sound failed"); gli_strict_warning(Mix_GetError()); SDL_LockAudio(); cleanup_channel(chan); SDL_UnlockAudio(); return 0; }
void services_die(const char *msg, int rboot) { ilog(L_NOTICE, "Dying: %s", msg); cleanup_channel_modes(); cleanup_conf(); #ifdef HAVE_RUBY cleanup_ruby(); #endif cleanup_db(); cleanup_modules(); EVP_cleanup(); send_queued_all(); exit_client(&me, &me, "Services shutting down"); send_queued_all(); if(me.uplink != NULL) MyFree(me.uplink->server); cleanup_client(); cleanup_channel(); cleanup_interface(); cleanup_mqueue(); cleanup_tor(); unregister_callback(iorecv_cb); unregister_callback(connected_cb); unregister_callback(iosend_cb); libio_cleanup(); exit(rboot); }
/** Start a sound channel */ static glui32 play_sound(schanid_t chan) { SDL_LockAudio(); chan->status = CHANNEL_SOUND; chan->buffered = 0; chan->sdl_channel = Mix_GroupAvailable(FREE); Mix_GroupChannel(chan->sdl_channel, BUSY); SDL_UnlockAudio(); chan->sample = Mix_LoadWAV_RW(chan->sdl_rwops, FALSE); if (chan->sdl_channel < 0) { gli_strict_warning("No available sound channels"); } if (chan->sdl_channel >= 0 && chan->sample) { SDL_LockAudio(); sound_channels[chan->sdl_channel] = chan; SDL_UnlockAudio(); Mix_Volume(chan->sdl_channel, chan->volume); Mix_ChannelFinished(&sound_completion_callback); if (Mix_PlayChannel(chan->sdl_channel, chan->sample, chan->loop-1) >= 0) return 1; } gli_strict_warning("play sound failed"); gli_strict_warning(Mix_GetError()); SDL_LockAudio(); cleanup_channel(chan); SDL_UnlockAudio(); return 0; }
void glk_schannel_destroy(schanid_t chan) { channel_t *prev, *next; if (!chan) { gli_strict_warning("schannel_destroy: invalid id."); return; } glk_schannel_stop(chan); cleanup_channel(chan); if (gli_unregister_obj) (*gli_unregister_obj)(chan, gidisp_Class_Schannel, chan->disprock); prev = chan->chain_prev; next = chan->chain_next; chan->chain_prev = NULL; chan->chain_next = NULL; if (prev) prev->chain_next = next; else gli_channellist = next; if (next) next->chain_prev = prev; free(chan); }
/* Notify the music channel completion */ static void music_completion_callback() { if (!music_channel) { gli_strict_warning("music callback failed"); return; } if (music_channel->notify) { gli_event_store(evtype_SoundNotify, 0, music_channel->resid, music_channel->notify); } cleanup_channel(music_channel); }
/** Start a mod music channel */ static glui32 play_mod(schanid_t chan, long len) { FILE *file; char *tn; char *tempdir; int music_busy; chan->status = CHANNEL_MUSIC; /* The fscking mikmod lib want to read the mod only from disk! */ tempdir = getenv("TEMP"); if (tempdir == NULL) tempdir = "."; tn = tempnam(tempdir, "gargtmp"); file = fopen(tn, "wb"); fwrite(chan->sdl_memory, 1, len, file); fclose(file); chan->music = Mix_LoadMUS(tn); remove(tn); free(tn); music_busy = Mix_PlayingMusic(); if (music_busy) gli_strict_warning("MOD player already in use"); if (!music_busy && chan->music) { SDL_LockAudio(); music_channel = chan; SDL_UnlockAudio(); Mix_VolumeMusic(chan->volume); Mix_HookMusicFinished(&music_completion_callback); if (Mix_PlayMusic(chan->music, chan->loop-1) >= 0) return 1; } gli_strict_warning("play mod failed"); gli_strict_warning(Mix_GetError()); SDL_LockAudio(); cleanup_channel(chan); SDL_UnlockAudio(); return 0; }
void glk_schannel_stop(schanid_t chan) { if (!chan) { gli_strict_warning("schannel_stop: invalid id."); return; } SDL_LockAudio(); chan->buffered = 0; SDL_UnlockAudio(); switch (chan->status) { case CHANNEL_SOUND: Mix_HaltChannel(chan->sdl_channel); break; case CHANNEL_MUSIC: Mix_HaltMusic(); break; } SDL_LockAudio(); cleanup_channel(chan); SDL_UnlockAudio(); }