static void mve_audio_callback(void *userdata, unsigned char *stream, int len) { int total=0; int length; if (mve_audio_bufhead == mve_audio_buftail) return /* 0 */; //con_printf(CON_CRITICAL, "+ <%d (%d), %d, %d>\n", mve_audio_bufhead, mve_audio_curbuf_curpos, mve_audio_buftail, len); while (mve_audio_bufhead != mve_audio_buftail /* while we have more buffers */ && len > (mve_audio_buflens[mve_audio_bufhead]-mve_audio_curbuf_curpos)) /* and while we need more data */ { length = mve_audio_buflens[mve_audio_bufhead]-mve_audio_curbuf_curpos; memcpy(stream, /* cur output position */ ((unsigned char *)mve_audio_buffers[mve_audio_bufhead])+mve_audio_curbuf_curpos, /* cur input position */ length); /* cur input length */ total += length; stream += length; /* advance output */ len -= length; /* decrement avail ospace */ mve_free(mve_audio_buffers[mve_audio_bufhead]); /* free the buffer */ mve_audio_buffers[mve_audio_bufhead]=NULL; /* free the buffer */ mve_audio_buflens[mve_audio_bufhead]=0; /* free the buffer */ if (++mve_audio_bufhead == TOTAL_AUDIO_BUFFERS) /* next buffer */ mve_audio_bufhead = 0; mve_audio_curbuf_curpos = 0; } //con_printf(CON_CRITICAL, "= <%d (%d), %d, %d>: %d\n", mve_audio_bufhead, mve_audio_curbuf_curpos, mve_audio_buftail, len, total); /* return total; */ if (len != 0 /* ospace remaining */ && mve_audio_bufhead != mve_audio_buftail) /* buffers remaining */ { memcpy(stream, /* dest */ ((unsigned char *)mve_audio_buffers[mve_audio_bufhead]) + mve_audio_curbuf_curpos, /* src */ len); /* length */ mve_audio_curbuf_curpos += len; /* advance input */ stream += len; /* advance output (unnecessary) */ len -= len; /* advance output (unnecessary) */ if (mve_audio_curbuf_curpos >= mve_audio_buflens[mve_audio_bufhead]) /* if this ends the current chunk */ { mve_free(mve_audio_buffers[mve_audio_bufhead]); /* free buffer */ mve_audio_buffers[mve_audio_bufhead]=NULL; mve_audio_buflens[mve_audio_bufhead]=0; if (++mve_audio_bufhead == TOTAL_AUDIO_BUFFERS) /* next buffer */ mve_audio_bufhead = 0; mve_audio_curbuf_curpos = 0; } } //con_printf(CON_CRITICAL, "- <%d (%d), %d, %d>\n", mve_audio_bufhead, mve_audio_curbuf_curpos, mve_audio_buftail, len); }
void MVE_rmEndMovie() { int i; timer_stop(); timer_created = 0; if (mve_audio_canplay) { // MD2211: if using SDL_Mixer, we never reinit sound, hence never close it #ifdef USE_SDLMIXER if (GameArg.SndDisableSdlMixer) #endif { SDL_CloseAudio(); } mve_audio_canplay = 0; } for (i = 0; i < TOTAL_AUDIO_BUFFERS; i++) if (mve_audio_buffers[i] != NULL) mve_free(mve_audio_buffers[i]); memset(mve_audio_buffers, 0, sizeof(mve_audio_buffers)); memset(mve_audio_buflens, 0, sizeof(mve_audio_buflens)); mve_audio_curbuf_curpos=0; mve_audio_bufhead=0; mve_audio_buftail=0; mve_audio_playing=0; mve_audio_canplay=0; mve_audio_compressed=0; if (mve_audio_spec) mve_free(mve_audio_spec); mve_audio_spec=NULL; audiobuf_created = 0; mve_free(g_vBuffers); g_vBuffers = NULL; g_pCurMap=NULL; g_nMapLength=0; videobuf_created = 0; video_initialized = 0; mve_close(mve); mve = NULL; }
void MVE_rmEndMovie() { #ifdef AUDIO int i; #endif timer_stop(); timer_created = 0; #ifdef AUDIO if (mve_audio_canplay) { // only close audio if we opened it SDL_CloseAudio(); mve_audio_canplay = 0; } for (i = 0; i < TOTAL_AUDIO_BUFFERS; i++) if (mve_audio_buffers[i] != NULL) mve_free(mve_audio_buffers[i]); memset(mve_audio_buffers, 0, sizeof(mve_audio_buffers)); memset(mve_audio_buflens, 0, sizeof(mve_audio_buflens)); mve_audio_curbuf_curpos=0; mve_audio_bufhead=0; mve_audio_buftail=0; mve_audio_playing=0; mve_audio_canplay=0; mve_audio_compressed=0; if (mve_audio_spec) mve_free(mve_audio_spec); mve_audio_spec=NULL; audiobuf_created = 0; #endif mve_free(g_vBuffers); g_vBuffers = NULL; g_pCurMap=NULL; g_nMapLength=0; videobuf_created = 0; video_initialized = 0; mve_close(mve); mve = NULL; }
static int audio_data_handler(unsigned char major, unsigned char minor, unsigned char *data, int len, void *context) { #ifdef USE_SDLMIXER // MD2211: for audio conversion SDL_AudioCVT cvt; int clen; int out_freq; Uint16 out_format; int out_channels; // end MD2211 #endif static const int selected_chan=1; int chan; int nsamp; if (mve_audio_canplay) { if (mve_audio_playing) SDL_LockAudio(); chan = get_ushort(data + 2); nsamp = get_ushort(data + 4); if (chan & selected_chan) { /* HACK: +4 mveaudio_uncompress adds 4 more bytes */ if (major == MVE_OPCODE_AUDIOFRAMEDATA) { if (mve_audio_compressed) { nsamp += 4; mve_audio_buflens[mve_audio_buftail] = nsamp; mve_audio_buffers[mve_audio_buftail] = (short *)mve_alloc(nsamp); mveaudio_uncompress(mve_audio_buffers[mve_audio_buftail], data, -1); /* XXX */ } else { nsamp -= 8; data += 8; mve_audio_buflens[mve_audio_buftail] = nsamp; mve_audio_buffers[mve_audio_buftail] = (short *)mve_alloc(nsamp); memcpy(mve_audio_buffers[mve_audio_buftail], data, nsamp); } } else { mve_audio_buflens[mve_audio_buftail] = nsamp; mve_audio_buffers[mve_audio_buftail] = (short *)mve_alloc(nsamp); memset(mve_audio_buffers[mve_audio_buftail], 0, nsamp); /* XXX */ } // MD2211: the following block does on-the-fly audio conversion for SDL_mixer #ifdef USE_SDLMIXER if (!GameArg.SndDisableSdlMixer) { // build converter: in = MVE format, out = SDL_mixer output Mix_QuerySpec(&out_freq, &out_format, &out_channels); // get current output settings SDL_BuildAudioCVT(&cvt, mve_audio_spec->format, mve_audio_spec->channels, mve_audio_spec->freq, out_format, out_channels, out_freq); clen = nsamp * cvt.len_mult; cvt.buf = malloc(clen); cvt.len = nsamp; // read the audio buffer into the conversion buffer memcpy(cvt.buf, mve_audio_buffers[mve_audio_buftail], nsamp); // do the conversion if (SDL_ConvertAudio(&cvt)) con_printf(CON_DEBUG,"audio conversion failed!\n"); // copy back to the audio buffer mve_free(mve_audio_buffers[mve_audio_buftail]); // free the old audio buffer mve_audio_buflens[mve_audio_buftail] = clen; mve_audio_buffers[mve_audio_buftail] = (short *)mve_alloc(clen); memcpy(mve_audio_buffers[mve_audio_buftail], cvt.buf, clen); } #endif if (++mve_audio_buftail == TOTAL_AUDIO_BUFFERS) mve_audio_buftail = 0; if (mve_audio_buftail == mve_audio_bufhead) con_printf(CON_CRITICAL, "d'oh! buffer ring overrun (%d)\n", mve_audio_bufhead); } if (mve_audio_playing) SDL_UnlockAudio(); } return 1; }