aboutsummaryrefslogtreecommitdiff
path: root/sound
diff options
context:
space:
mode:
authorMax Horn2003-07-29 02:21:07 +0000
committerMax Horn2003-07-29 02:21:07 +0000
commit04843469eb7eff983c10c9eac42ac9e51d82ec29 (patch)
tree586d13b99b94452854d0b459eeaa1a4540e4f59b /sound
parentbb35528f43793042473602d1b3fb28e732c8bd0f (diff)
downloadscummvm-rg350-04843469eb7eff983c10c9eac42ac9e51d82ec29.tar.gz
scummvm-rg350-04843469eb7eff983c10c9eac42ac9e51d82ec29.tar.bz2
scummvm-rg350-04843469eb7eff983c10c9eac42ac9e51d82ec29.zip
some cleanup; moved around some stuff, preparing to unify more code of ChannelMP3CDMusic and ChannelMP3
svn-id: r9274
Diffstat (limited to 'sound')
-rw-r--r--sound/mixer.cpp57
1 files changed, 31 insertions, 26 deletions
diff --git a/sound/mixer.cpp b/sound/mixer.cpp
index c983f914c2..b2daa36d68 100644
--- a/sound/mixer.cpp
+++ b/sound/mixer.cpp
@@ -128,6 +128,7 @@ protected:
struct mad_synth _synth;
uint32 _posInFrame;
uint32 _size;
+ bool _initialized;
public:
ChannelMP3Common(SoundMixer *mixer, PlayingSoundHandle *handle);
@@ -149,7 +150,6 @@ class ChannelMP3CDMusic : public ChannelMP3Common {
uint32 _bufferSize;
mad_timer_t _duration;
File *_file;
- bool _initialized;
public:
ChannelMP3CDMusic(SoundMixer *mixer, PlayingSoundHandle *handle, File *file, mad_timer_t duration);
@@ -920,6 +920,8 @@ ChannelMP3Common::ChannelMP3Common(SoundMixer *mixer, PlayingSoundHandle *handle
#endif
mad_frame_init(&_frame);
mad_synth_init(&_synth);
+
+ _initialized = false;
}
ChannelMP3Common::~ChannelMP3Common() {
@@ -930,6 +932,20 @@ ChannelMP3Common::~ChannelMP3Common() {
mad_stream_finish(&_stream);
}
+static inline int scale_sample(mad_fixed_t sample) {
+ /* round */
+ sample += (1L << (MAD_F_FRACBITS - 16));
+
+ /* clip */
+ if (sample > MAD_F_ONE - 1)
+ sample = MAD_F_ONE - 1;
+ else if (sample < -MAD_F_ONE)
+ sample = -MAD_F_ONE;
+
+ /* quantize and scale to not saturate when mixing a lot of channels */
+ return sample >> (MAD_F_FRACBITS + 1 - 16);
+}
+
ChannelMP3::ChannelMP3(SoundMixer *mixer, PlayingSoundHandle *handle, void *sound, uint size, byte flags)
: ChannelMP3Common(mixer, handle) {
_posInFrame = 0xFFFFFFFF;
@@ -940,7 +956,7 @@ ChannelMP3::ChannelMP3(SoundMixer *mixer, PlayingSoundHandle *handle, void *soun
/* This variable is the number of samples to cut at the start of the MP3
file. This is needed to have lip-sync as the MP3 file have some miliseconds
- of blank at the start (as, I suppose, the MP3 compression algorithm need to
+ of blank at the start (as, I suppose, the MP3 compression algorithm needs to
have some silence at the start to really be efficient and to not distort
too much the start of the sample).
@@ -953,23 +969,14 @@ ChannelMP3::ChannelMP3(SoundMixer *mixer, PlayingSoundHandle *handle, void *soun
_silenceCut = 576 * 2;
}
-static inline int scale_sample(mad_fixed_t sample) {
- /* round */
- sample += (1L << (MAD_F_FRACBITS - 16));
-
- /* clip */
- if (sample > MAD_F_ONE - 1)
- sample = MAD_F_ONE - 1;
- else if (sample < -MAD_F_ONE)
- sample = -MAD_F_ONE;
-
- /* quantize and scale to not saturate when mixing a lot of channels */
- return sample >> (MAD_F_FRACBITS + 1 - 16);
-}
-
void ChannelMP3::mix(int16 *data, uint len) {
const int volume = _mixer->getVolume();
+ if (!_initialized) {
+ // TODO: instead of using _silenceCut, skip first two frames like
+ // it is done in ChannelMP3CDMusic::mix()
+ }
+
while (1) {
/* Skip _silence_cut a the start */
@@ -1024,7 +1031,6 @@ ChannelMP3CDMusic::ChannelMP3CDMusic(SoundMixer *mixer, PlayingSoundHandle *hand
: ChannelMP3Common(mixer, handle) {
_file = file;
_duration = duration;
- _initialized = false;
_bufferSize = MP3CD_BUFFERING_SIZE;
_ptr = (byte *)malloc(MP3CD_BUFFERING_SIZE);
_releasePtr = true;
@@ -1032,10 +1038,9 @@ ChannelMP3CDMusic::ChannelMP3CDMusic(SoundMixer *mixer, PlayingSoundHandle *hand
void ChannelMP3CDMusic::mix(int16 *data, uint len) {
mad_timer_t frame_duration;
- int volume = _mixer->getMusicVolume();
+ const int volume = _mixer->getMusicVolume();
if (!_initialized) {
- int skip_loop;
// just skipped
memset(_ptr, 0, _bufferSize);
_size = _file->read(_ptr, _bufferSize);
@@ -1046,14 +1051,13 @@ void ChannelMP3CDMusic::mix(int16 *data, uint len) {
}
// Resync
mad_stream_buffer(&_stream, _ptr, _size);
- skip_loop = 2;
+
+ // Skip the first two frames (see ChannelMP3::ChannelMP3 for an explanation)
+ int skip_loop = 2;
while (skip_loop != 0) {
if (mad_frame_decode(&_frame, &_stream) == 0) {
/* Do not decrease duration - see if it's a problem */
skip_loop--;
- if (skip_loop == 0) {
- mad_synth_frame(&_synth, &_frame);
- }
} else {
if (!MAD_RECOVERABLE(_stream.error)) {
debug(1, "Unrecoverable error while skipping !");
@@ -1062,6 +1066,8 @@ void ChannelMP3CDMusic::mix(int16 *data, uint len) {
}
}
}
+ mad_synth_frame(&_synth, &_frame);
+
// We are supposed to be in synch
mad_frame_mute(&_frame);
mad_synth_mute(&_synth);
@@ -1106,14 +1112,13 @@ void ChannelMP3CDMusic::mix(int16 *data, uint len) {
int not_decoded;
if (!_stream.next_frame) {
- memset(_ptr, 0, _bufferSize + MAD_BUFFER_GUARD);
- _size = _file->read(_ptr, _bufferSize);
not_decoded = 0;
+ memset(_ptr, 0, _bufferSize + MAD_BUFFER_GUARD);
} else {
not_decoded = _stream.bufend - _stream.next_frame;
memcpy(_ptr, _stream.next_frame, not_decoded);
- _size = _file->read(_ptr + not_decoded, _bufferSize - not_decoded);
}
+ _size = _file->read(_ptr + not_decoded, _bufferSize - not_decoded);
if (_size <= 0) {
return;
}