static int audio_data_handler(unsigned char major, unsigned char minor, unsigned char *data, int len, void *context) { #ifdef AUDIO 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 */ } if (++mve_audio_buftail == TOTAL_AUDIO_BUFFERS) mve_audio_buftail = 0; #ifndef WIN32 if (mve_audio_buftail == mve_audio_bufhead) fprintf(stderr, "d'oh! buffer ring overrun (%d)\n", mve_audio_bufhead); #endif } if (mve_audio_playing) SDL_UnlockAudio(); } #endif return 1; }
static int create_videobuf_handler(unsigned char major, unsigned char minor, unsigned char *data, int len, void *context) { short w, h, #ifdef DEBUG count, #endif truecolor; if (videobuf_created) return 1; else videobuf_created = 1; w = get_short(data); h = get_short(data+2); #ifdef DEBUG if (minor > 0) { count = get_short(data+4); } else { count = 1; } #endif if (minor > 1) { truecolor = get_short(data+6); } else { truecolor = 0; } g_width = w << 3; g_height = h << 3; /* TODO: * 4 causes crashes on some files */ /* only malloc once */ if (g_vBuffers == NULL) g_vBackBuf1 = g_vBuffers = mve_alloc(g_width * g_height * 8); if (truecolor) { g_vBackBuf2 = (unsigned short *)g_vBackBuf1 + (g_width * g_height); } else { g_vBackBuf2 = (unsigned char *)g_vBackBuf1 + (g_width * g_height); } memset(g_vBackBuf1, 0, g_width * g_height * 4); #ifdef DEBUG con_printf(CON_CRITICAL, "DEBUG: w,h=%d,%d count=%d, tc=%d\n", w, h, count, truecolor); #endif g_truecolor = truecolor; return 1; }
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; }
static int create_audiobuf_handler(unsigned char major, unsigned char minor, unsigned char *data, int len, void *context) { int flags; int sample_rate; int desired_buffer; int stereo; int bitsize; int compressed; int format; if (!mve_audio_enabled) return 1; if (audiobuf_created) return 1; else audiobuf_created = 1; flags = get_ushort(data + 2); sample_rate = get_ushort(data + 4); desired_buffer = get_int(data + 6); stereo = (flags & MVE_AUDIO_FLAGS_STEREO) ? 1 : 0; bitsize = (flags & MVE_AUDIO_FLAGS_16BIT) ? 1 : 0; if (minor > 0) { compressed = flags & MVE_AUDIO_FLAGS_COMPRESSED ? 1 : 0; } else { compressed = 0; } mve_audio_compressed = compressed; if (bitsize == 1) { #ifdef WORDS_BIGENDIAN format = AUDIO_S16MSB; #else format = AUDIO_S16LSB; #endif } else { format = AUDIO_U8; } #ifdef USE_SDLMIXER if (GameArg.SndDisableSdlMixer) #endif { con_printf(CON_CRITICAL, "creating audio buffers:\n"); con_printf(CON_CRITICAL, "sample rate = %d, desired buffer = %d, stereo = %d, bitsize = %d, compressed = %d\n", sample_rate, desired_buffer, stereo, bitsize ? 16 : 8, compressed); } mve_audio_spec = (SDL_AudioSpec *)mve_alloc(sizeof(SDL_AudioSpec)); mve_audio_spec->freq = sample_rate; mve_audio_spec->format = format; mve_audio_spec->channels = (stereo) ? 2 : 1; mve_audio_spec->samples = 4096; mve_audio_spec->callback = mve_audio_callback; mve_audio_spec->userdata = NULL; // MD2211: if using SDL_Mixer, we never reinit the sound system #ifdef USE_SDLMIXER if (GameArg.SndDisableSdlMixer) #endif { if (SDL_OpenAudio(mve_audio_spec, NULL) >= 0) { con_printf(CON_CRITICAL, " success\n"); mve_audio_canplay = 1; } else { con_printf(CON_CRITICAL, " failure : %s\n", SDL_GetError()); mve_audio_canplay = 0; } } #ifdef USE_SDLMIXER else { // MD2211: using the same old SDL audio callback as a postmixer in SDL_mixer Mix_SetPostMix(mve_audio_spec->callback, mve_audio_spec->userdata); mve_audio_canplay = 1; } #endif memset(mve_audio_buffers, 0, sizeof(mve_audio_buffers)); memset(mve_audio_buflens, 0, sizeof(mve_audio_buflens)); return 1; }
static int create_audiobuf_handler(unsigned char major, unsigned char minor, unsigned char *data, int len, void *context) { #ifdef AUDIO int flags; int sample_rate; int desired_buffer; int stereo; int bitsize; int compressed; int format; if (!mve_audio_enabled) return 1; if (audiobuf_created) return 1; else audiobuf_created = 1; flags = get_ushort(data + 2); sample_rate = get_ushort(data + 4); desired_buffer = get_int(data + 6); stereo = (flags & MVE_AUDIO_FLAGS_STEREO) ? 1 : 0; bitsize = (flags & MVE_AUDIO_FLAGS_16BIT) ? 1 : 0; if (minor > 0) { compressed = flags & MVE_AUDIO_FLAGS_COMPRESSED ? 1 : 0; } else { compressed = 0; } mve_audio_compressed = compressed; if (bitsize == 1) { #if defined(WORDS_BIGENDIAN) || defined(__BIG_ENDIAN__) format = AUDIO_S16MSB; #else format = AUDIO_S16LSB; #endif } else { format = AUDIO_U8; } #if 0 fprintf(stderr, "creating audio buffers:\n"); fprintf(stderr, "sample rate = %d, stereo = %d, bitsize = %d, compressed = %d\n", sample_rate, stereo, bitsize ? 16 : 8, compressed); #endif mve_audio_spec = (SDL_AudioSpec *)mve_alloc(sizeof(SDL_AudioSpec)); mve_audio_spec->freq = sample_rate; mve_audio_spec->format = format; mve_audio_spec->channels = (stereo) ? 2 : 1; mve_audio_spec->samples = 4096; mve_audio_spec->callback = mve_audio_callback; mve_audio_spec->userdata = NULL; if (SDL_OpenAudio(mve_audio_spec, NULL) >= 0) { #if 0 fprintf(stderr, " success\n"); #endif mve_audio_canplay = 1; } else { #if 0 fprintf(stderr, " failure : %s\n", SDL_GetError(); #endif mve_audio_canplay = 0; } memset(mve_audio_buffers, 0, sizeof(mve_audio_buffers)); memset(mve_audio_buflens, 0, sizeof(mve_audio_buflens)); #endif return 1; }