mirror of
https://github.com/libretro/scummvm.git
synced 2025-03-05 01:38:36 +00:00
changed the way 'streams' are handled: the finalization logic is now in the WrappedAudioInputStream; this allows further streamlining of the channel/mixer code (can you already guess what I am working towards? :-)
svn-id: r11696
This commit is contained in:
parent
34d1751fe4
commit
4343567458
@ -118,6 +118,7 @@ protected:
|
||||
byte *_bufferEnd;
|
||||
byte *_pos;
|
||||
byte *_end;
|
||||
bool _finalized;
|
||||
|
||||
inline bool eosIntern() const { return _end == _pos; };
|
||||
public:
|
||||
@ -126,10 +127,11 @@ public:
|
||||
int readBuffer(int16 *buffer, const int numSamples);
|
||||
|
||||
int16 read();
|
||||
bool eos() const { return eosIntern(); }
|
||||
bool eos() const { return _finalized; }
|
||||
bool isStereo() const { return stereo; }
|
||||
|
||||
void append(const byte *data, uint32 len);
|
||||
void finish() { _finalized = true; }
|
||||
};
|
||||
|
||||
|
||||
@ -145,6 +147,8 @@ WrappedMemoryStream<stereo, is16Bit, isUnsigned>::WrappedMemoryStream(uint buffe
|
||||
_bufferStart = (byte *)malloc(bufferSize);
|
||||
_pos = _end = _bufferStart;
|
||||
_bufferEnd = _bufferStart + bufferSize;
|
||||
|
||||
_finalized = false;
|
||||
}
|
||||
|
||||
template<bool stereo, bool is16Bit, bool isUnsigned>
|
||||
@ -189,6 +193,9 @@ void WrappedMemoryStream<stereo, is16Bit, isUnsigned>::append(const byte *data,
|
||||
assert((len & 3) == 0);
|
||||
else if (is16Bit || stereo)
|
||||
assert((len & 1) == 0);
|
||||
|
||||
// Verify the stream has not been finalized (by a call to finish()) yet
|
||||
assert(!_finalized);
|
||||
|
||||
if (_end + len > _bufferEnd) {
|
||||
// Wrap-around case
|
||||
|
@ -83,6 +83,7 @@ public:
|
||||
class WrappedAudioInputStream : public AudioInputStream {
|
||||
public:
|
||||
virtual void append(const byte *data, uint32 len) = 0;
|
||||
virtual void finish() = 0;
|
||||
};
|
||||
|
||||
class ZeroInputStream : public AudioInputStream {
|
||||
|
@ -88,13 +88,12 @@ public:
|
||||
};
|
||||
|
||||
class ChannelStream : public Channel {
|
||||
bool _finished;
|
||||
public:
|
||||
ChannelStream(SoundMixer *mixer, PlayingSoundHandle *handle, void *sound, uint32 size, uint rate, byte flags, uint32 buffer_size, byte volume, int8 pan);
|
||||
void mix(int16 *data, uint len);
|
||||
void append(void *sound, uint32 size);
|
||||
bool isMusicChannel() const { return true; }
|
||||
void finish() { _finished = true; }
|
||||
|
||||
void finish();
|
||||
};
|
||||
|
||||
#ifdef USE_MAD
|
||||
@ -523,11 +522,11 @@ ChannelRaw::ChannelRaw(SoundMixer *mixer, PlayingSoundHandle *handle, void *soun
|
||||
_input = makeLinearInputStream(flags, _ptr, size, 0, 0);
|
||||
}
|
||||
|
||||
// Get a rate converter instance
|
||||
_converter = makeRateConverter(rate, mixer->getOutputRate(), _input->isStereo(), (flags & SoundMixer::FLAG_REVERSE_STEREO) != 0);
|
||||
|
||||
if (!(flags & SoundMixer::FLAG_AUTOFREE))
|
||||
_ptr = 0;
|
||||
|
||||
// Get a rate converter instance
|
||||
_converter = makeRateConverter(rate, mixer->getOutputRate(), _input->isStereo(), (flags & SoundMixer::FLAG_REVERSE_STEREO) != 0);
|
||||
}
|
||||
|
||||
ChannelRaw::~ChannelRaw() {
|
||||
@ -544,37 +543,20 @@ ChannelStream::ChannelStream(SoundMixer *mixer, PlayingSoundHandle *handle,
|
||||
_input = makeWrappedInputStream(flags, buffer_size);
|
||||
|
||||
// Append the initial data
|
||||
((WrappedAudioInputStream *)_input)->append((const byte *)sound, size);
|
||||
append(sound, size);
|
||||
|
||||
// Get a rate converter instance
|
||||
_converter = makeRateConverter(rate, mixer->getOutputRate(), _input->isStereo(), (flags & SoundMixer::FLAG_REVERSE_STEREO) != 0);
|
||||
}
|
||||
|
||||
_finished = false;
|
||||
void ChannelStream::finish() {
|
||||
((WrappedAudioInputStream *)_input)->finish();
|
||||
}
|
||||
|
||||
void ChannelStream::append(void *data, uint32 len) {
|
||||
((WrappedAudioInputStream *)_input)->append((const byte *)data, len);
|
||||
}
|
||||
|
||||
void ChannelStream::mix(int16 *data, uint len) {
|
||||
assert(_input);
|
||||
if (_input->eos()) {
|
||||
// TODO: call drain method
|
||||
|
||||
// Normally, the stream stays around even if all its data is used up.
|
||||
// This is in case more data is streamed into it. To make the stream
|
||||
// go away, one can either stop() it (which takes effect immediately,
|
||||
// ignoring any remaining sound data), or finish() it, which means
|
||||
// it will finish playing before it terminates itself.
|
||||
if (_finished) {
|
||||
destroy();
|
||||
}
|
||||
} else {
|
||||
// Invoke the parent implementation.
|
||||
Channel::mix(data, len);
|
||||
}
|
||||
}
|
||||
|
||||
#ifdef USE_MAD
|
||||
ChannelMP3::ChannelMP3(SoundMixer *mixer, PlayingSoundHandle *handle, File *file, uint size, byte volume, int8 pan)
|
||||
: Channel(mixer, handle, volume, pan), _isMusic(false) {
|
||||
|
Loading…
x
Reference in New Issue
Block a user