diff options
-rwxr-xr-x | mp3_cd.cpp | 293 | ||||
-rwxr-xr-x | mp3_cd.h | 45 |
2 files changed, 0 insertions, 338 deletions
diff --git a/mp3_cd.cpp b/mp3_cd.cpp deleted file mode 100755 index 82d54d30b7..0000000000 --- a/mp3_cd.cpp +++ /dev/null @@ -1,293 +0,0 @@ -/* ScummVM - Scumm Interpreter - * Copyright (C) 2002 The ScummVM project - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - * - * $Header$ - */ - -#include "stdafx.h" -#include "scumm.h" - -#ifdef COMPRESSED_SOUND_FILE__ -#include "mp3_cd.h" -#include <SDL.h> - -int _current_mp3_cd_track; -struct xing _vbr_header; -struct mad_header _mad_header; -long _mp3_size; -FILE *_mp3_track; -MixerChannel *_mc; - -// From xing.c in MAD - -int xing_parse(struct xing *xing, struct mad_bitptr ptr, unsigned int bitlen) -{ - - xing->flags = 0; - - if (bitlen < 64 || mad_bit_read(&ptr, 32) != XING_MAGIC) - goto fail; - - xing->flags = mad_bit_read(&ptr, 32); - bitlen -= 64; - - if (xing->flags & XING_FRAMES) { - if (bitlen < 32) - goto fail; - - xing->frames = mad_bit_read(&ptr, 32); - bitlen -= 32; - } - - if (xing->flags & XING_BYTES) { - if (bitlen < 32) - goto fail; - - xing->bytes = mad_bit_read(&ptr, 32); - bitlen -= 32; - } - - if (xing->flags & XING_TOC) { - int i; - - if (bitlen < 800) - goto fail; - - for (i = 0; i < 100; ++i) - xing->toc[i] = (unsigned char)mad_bit_read(&ptr, 8); - - bitlen -= 800; - } - - if (xing->flags & XING_SCALE) { - if (bitlen < 32) - goto fail; - - xing->scale = mad_bit_read(&ptr, 32); - bitlen -= 32; - } - - return 0; - -fail: - xing->flags = 0; - return -1; -} - -// Borrowed from Winamp plugin in_mad.c - -bool parse_xing_vbr_tag() -{ - struct mad_stream stream; - struct mad_frame frame; - unsigned char buffer[8192]; - unsigned int buflen = 0; - int count = 0, result = 0; - - _vbr_header.flags = 0; - - mad_stream_init(&stream); - mad_frame_init(&frame); - - fseek(_mp3_track, 0, SEEK_SET); - - while (1) { - if (buflen < sizeof(buffer)) { - uint16 bytes; - - bytes = fread(buffer + buflen, 1, sizeof(buffer) - buflen, _mp3_track); - if (bytes <= 0) { - if (bytes == -1) - result = -1; - break; - } - - buflen += bytes; - } - - mad_stream_buffer(&stream, buffer, buflen); - - while (1) { - if (mad_frame_decode(&frame, &stream) == -1) { - if (!MAD_RECOVERABLE(stream.error)) - break; - - if (stream.error != MAD_ERROR_BADCRC) - continue; - } - - if (count++ || - xing_parse(&_vbr_header, stream.anc_ptr, stream.anc_bitlen) - == -1) - break; - } - - if (count || stream.error != MAD_ERROR_BUFLEN) - break; - - memmove(buffer, stream.next_frame, - buflen = &buffer[buflen] - stream.next_frame); - } - - if (count) - memcpy(&_mad_header, &frame.header, sizeof(mad_header)); - else - result = -1; - - mad_frame_finish(&frame); - mad_stream_finish(&stream); - - return (result != -1); -} - -uint32 calc_cd_file_offset(int start_frame) -{ - long offset; - - if (!_vbr_header.flags) { - float frame_size; - //mad_timer_t timer; - recode with timer - - /* Constant bit rate - perhaps not fully accurate */ - frame_size = 144 * _mad_header.bitrate / _mad_header.samplerate; - offset = (long)((float)start_frame / (float)CD_FPS * 1000 / - (float)((float)1152 / (float)_mad_header.samplerate * - 1000) * (float)(frame_size + 0.5)); - } else { - /* DOES NOT WORK AT THE MOMENT */ - /* see Xing SDK */ - long a; - float fa, fb, fx; - float percent = (float)start_frame / (float)CD_FPS * 1000 / - ((float)((float)1152 / (float)_mad_header.samplerate * 1000) * - _vbr_header.frames) * 100; - - if (percent < 0.0f) - percent = 0.0f; - if (percent > 100.0f) - percent = 100.0f; - - a = (int)percent; - if (a > 99) - a = 99; - fa = _vbr_header.toc[a]; - if (a < 99) { - fb = _vbr_header.toc[a + 1]; - } else { - fb = 256.0f; - } - - fx = fa + (fb - fa) * (percent - a); - - offset = (int)((1.0f / 256.0f) * fx * _vbr_header.bytes); - - } - - return offset; -} - -bool mp3_cd_play(Scumm *s, int track, int num_loops, int start_frame, - int end_frame) -{ - - // See if we are already playing this track, else try to open it - - if (_current_mp3_cd_track != track) { - char track_name[1024]; - - sprintf(track_name, "%strack%d.mp3", s->_gameDataPath, track); - _mp3_track = fopen(track_name, "rb"); - if (!_mp3_track) { - warning("No CD and track %d not available in mp3 format", track); - return false; - } - - if (!parse_xing_vbr_tag()) { - warning("Error parsing file header - ignoring file", track); - fclose(_mp3_track); - return false; - } - - if (_vbr_header.flags) { - if (!((_vbr_header.flags & XING_TOC) && - (_vbr_header.flags & XING_BYTES) && - (_vbr_header.flags & XING_FRAMES) - )) { - warning("Missing required part of VBR header - ignoring file"); - fclose(_mp3_track); - _vbr_header.flags = 0; - return false; - } - } - // Allocate the music mixer if necessary - - if (!_mc) { - _mc = s->allocateMixer(); - if (!_mc) { - warning("No mixer channel available for MP3 music"); - return false; - } - } - - fseek(_mp3_track, 0, SEEK_END); - _mp3_size = ftell(_mp3_track); - fseek(_mp3_track, 0, SEEK_SET); - - _mc->type = MIXER_MP3_CDMUSIC; - _mc->sound_data.mp3_cdmusic.file = _mp3_track; - _mc->sound_data.mp3_cdmusic.playing = false; - _mc->sound_data.mp3_cdmusic.buffer_size = 200000; - _mc->_sfx_sound = malloc(_mc->sound_data.mp3_cdmusic.buffer_size); - - /* see if it's enough */ - mad_stream_init(&_mc->sound_data.mp3.stream); - if (_mad_header.samplerate == 44100) - mad_stream_options((mad_stream *) & _mc->sound_data.mp3.stream, - MAD_OPTION_HALFSAMPLERATE); - - mad_frame_init(&_mc->sound_data.mp3.frame); - mad_synth_init(&_mc->sound_data.mp3.synth); - - _current_mp3_cd_track = track; - } - - - if (_current_mp3_cd_track == track) { - - uint32 where; - - // See where we want to go - where = calc_cd_file_offset(start_frame); - - if (start_frame < 0 || end_frame < 0) { - warning("Negative index in frame"); - return false; - } - - mad_timer_set(&_mc->sound_data.mp3_cdmusic.duration, - 0, end_frame, CD_FPS); - - fseek(_mp3_track, where, SEEK_SET); - _mc->sound_data.mp3_cdmusic.playing = true; - - return true; - } - - return false; -} - -#endif diff --git a/mp3_cd.h b/mp3_cd.h deleted file mode 100755 index 65c838fccf..0000000000 --- a/mp3_cd.h +++ /dev/null @@ -1,45 +0,0 @@ -/* ScummVM - Scumm Interpreter - * Copyright (C) 2002 The ScummVM project - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - * - * $Header$ - */ - -#ifndef MP3_CD_H -#define MP3_CD_H - -// From xing.h in MAD - -# define XING_MAGIC (('X' << 24) | ('i' << 16) | ('n' << 8) | 'g') - -struct xing { - long flags; /* valid fields (see below) */ - unsigned long frames; /* total number of frames */ - unsigned long bytes; /* total number of bytes */ - unsigned char toc[100]; /* 100-point seek table */ - long scale; /* ?? */ -}; - -enum { - XING_FRAMES = 0x00000001L, - XING_BYTES = 0x00000002L, - XING_TOC = 0x00000004L, - XING_SCALE = 0x00000008L -}; - -bool mp3_cd_play(Scumm *s, int track, int num_loops, int start_frame, int end_frame); - -#endif |