ScummVM API documentation
audiostream.h
1/* ScummVM - Graphic Adventure Engine
2 *
3 * ScummVM is the legal property of its developers, whose names
4 * are too numerous to list here. Please refer to the COPYRIGHT
5 * file distributed with this source distribution.
6 *
7 * This program is free software: you can redistribute it and/or modify
8 * it under the terms of the GNU General Public License as published by
9 * the Free Software Foundation, either version 3 of the License, or
10 * (at your option) any later version.
11 *
12 * This program is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 * GNU General Public License for more details.
16 *
17 * You should have received a copy of the GNU General Public License
18 * along with this program. If not, see <http://www.gnu.org/licenses/>.
19 *
20 */
21
22#ifndef AUDIO_AUDIOSTREAM_H
23#define AUDIO_AUDIOSTREAM_H
24
25#include "common/ptr.h"
26#include "common/scummsys.h"
27#include "common/types.h"
28
29#include "audio/timestamp.h"
30
31namespace Common {
32class Path;
33class SeekableReadStream;
34}
35
36namespace Audio {
37
51public:
52 virtual ~AudioStream() {}
53
70 virtual int readBuffer(int16 *buffer, const int numSamples) = 0;
71
73 virtual bool isStereo() const = 0;
74
76 virtual int getRate() const = 0;
77
87 virtual bool endOfData() const = 0;
88
99 virtual bool endOfStream() const { return endOfData(); }
100};
101
109class RewindableAudioStream : public virtual AudioStream {
110public:
116 virtual bool rewind() = 0;
117};
118
123class LoopableAudioStream : public virtual AudioStream {
124public:
125
129 virtual uint getCompleteIterations() const = 0;
130
135 virtual void setRemainingIterations(uint loops) = 0;
136};
137
145public:
158 LoopingAudioStream(RewindableAudioStream *stream, uint loops, DisposeAfterUse::Flag disposeAfterUse = DisposeAfterUse::YES, bool rewind = true);
159
172 LoopingAudioStream(Common::DisposablePtr<RewindableAudioStream>&& stream, uint loops, bool rewind = true);
173
174 int readBuffer(int16 *buffer, const int numSamples) override;
175 bool endOfData() const override;
176 bool endOfStream() const override;
177
178 bool isStereo() const override { return _parent->isStereo(); }
179 int getRate() const override { return _parent->getRate(); }
180
181 uint getCompleteIterations() const override { return _completeIterations; }
182 void setRemainingIterations(uint loops) override { _loops = _completeIterations + loops; }
183private:
185
186 uint _loops;
187 uint _completeIterations;
188};
189
204
213public:
226
234 bool seek(uint32 where) {
235 return seek(Timestamp(where, getRate()));
236 }
237
245 virtual bool seek(const Timestamp &where) = 0;
246
252 virtual Timestamp getLength() const = 0;
253
254 bool rewind() override { return seek(0); }
255};
256
276
288public:
303 const Timestamp loopStart,
304 const Timestamp loopEnd,
305 DisposeAfterUse::Flag disposeAfterUse = DisposeAfterUse::YES);
306
307 int readBuffer(int16 *buffer, const int numSamples) override;
308 bool endOfData() const override;
309 bool endOfStream() const override;
310
311 bool isStereo() const override { return _parent->isStereo(); }
312 int getRate() const override { return _parent->getRate(); }
313
314 uint getCompleteIterations() const override { return _completeIterations; }
315 void setRemainingIterations(uint loops) override { _loops = _completeIterations + loops; }
316private:
318
319 uint _loops;
320 uint _completeIterations;
321 Timestamp _pos;
322 Timestamp _loopStart, _loopEnd;
323};
324
325
335public:
344 SubSeekableAudioStream(SeekableAudioStream *parent, const Timestamp start, const Timestamp end, DisposeAfterUse::Flag disposeAfterUse = DisposeAfterUse::YES);
345
346 int readBuffer(int16 *buffer, const int numSamples) override;
347
348 bool isStereo() const override { return _parent->isStereo(); }
349
350 int getRate() const override { return _parent->getRate(); }
351
352 bool endOfData() const override { return (_pos >= _length) || _parent->endOfData(); }
353 bool endOfStream() const override { return (_pos >= _length) || _parent->endOfStream(); }
354
355 bool seek(const Timestamp &where) override;
356
357 Timestamp getLength() const override { return _length; }
358private:
360
361 const Timestamp _start;
362 const Timestamp _length;
363 Timestamp _pos;
364};
365
371public:
372
380 virtual void queueAudioStream(Audio::AudioStream *audStream,
381 DisposeAfterUse::Flag disposeAfterUse = DisposeAfterUse::YES) = 0;
382
397 void queueBuffer(byte *data, uint32 size, DisposeAfterUse::Flag disposeAfterUse, byte flags);
398
405 virtual void finish() = 0;
406
411 virtual uint32 numQueuedStreams() const = 0;
412};
413
418
427Timestamp convertTimeToStreamPos(const Timestamp &where, int rate, bool isStereo);
428
437AudioStream *makeLimitingAudioStream(AudioStream *parentStream, const Timestamp &length, DisposeAfterUse::Flag disposeAfterUse = DisposeAfterUse::YES);
438
446class PacketizedAudioStream : public virtual AudioStream {
447public:
448 virtual ~PacketizedAudioStream() {}
449
454
461 virtual void finish() = 0;
462};
463
472public:
477 StatelessPacketizedAudioStream(uint rate, uint channels) :
478 _rate(rate), _channels(channels), _stream(makeQueuingAudioStream(rate, channels == 2)) {}
480
481 // AudioStream API
482 bool isStereo() const override { return _channels == 2; }
483 int getRate() const override { return _rate; }
484 int readBuffer(int16 *data, const int numSamples) override { return _stream->readBuffer(data, numSamples); }
485 bool endOfData() const override { return _stream->endOfData(); }
486 bool endOfStream() const override { return _stream->endOfStream(); }
487
488 uint32 numQueuedStreams() const { return _stream->numQueuedStreams(); }
489
490 // PacketizedAudioStream API
491 void queuePacket(Common::SeekableReadStream *data) override { _stream->queueAudioStream(makeStream(data)); }
492 void finish() override { _stream->finish(); }
493
497 uint getChannels() const { return _channels; }
498
499protected:
504
505private:
506 uint _rate;
507 uint _channels;
509};
510
516
520AudioStream *makeSilentAudioStream(int rate, bool stereo);
521
523} // End of namespace Audio
524
525#endif
Definition: audiostream.h:50
virtual int readBuffer(int16 *buffer, const int numSamples)=0
virtual bool endOfData() const =0
virtual bool isStereo() const =0
virtual int getRate() const =0
virtual bool endOfStream() const
Definition: audiostream.h:99
Definition: audiostream.h:123
virtual void setRemainingIterations(uint loops)=0
virtual uint getCompleteIterations() const =0
Definition: audiostream.h:144
int readBuffer(int16 *buffer, const int numSamples) override
LoopingAudioStream(RewindableAudioStream *stream, uint loops, DisposeAfterUse::Flag disposeAfterUse=DisposeAfterUse::YES, bool rewind=true)
LoopingAudioStream(Common::DisposablePtr< RewindableAudioStream > &&stream, uint loops, bool rewind=true)
int getRate() const override
Definition: audiostream.h:179
bool endOfStream() const override
bool isStereo() const override
Definition: audiostream.h:178
bool endOfData() const override
uint getCompleteIterations() const override
Definition: audiostream.h:181
void setRemainingIterations(uint loops) override
Definition: audiostream.h:182
Definition: audiostream.h:446
virtual void queuePacket(Common::SeekableReadStream *data)=0
Definition: audiostream.h:370
virtual void finish()=0
virtual void queueAudioStream(Audio::AudioStream *audStream, DisposeAfterUse::Flag disposeAfterUse=DisposeAfterUse::YES)=0
virtual uint32 numQueuedStreams() const =0
void queueBuffer(byte *data, uint32 size, DisposeAfterUse::Flag disposeAfterUse, byte flags)
Definition: audiostream.h:109
Definition: audiostream.h:212
virtual bool seek(const Timestamp &where)=0
bool rewind() override
Definition: audiostream.h:254
static SeekableAudioStream * openStreamFile(const Common::Path &basename)
bool seek(uint32 where)
Definition: audiostream.h:234
virtual Timestamp getLength() const =0
Definition: audiostream.h:471
uint getChannels() const
Definition: audiostream.h:497
int readBuffer(int16 *data, const int numSamples) override
Definition: audiostream.h:484
bool endOfData() const override
Definition: audiostream.h:485
bool endOfStream() const override
Definition: audiostream.h:486
int getRate() const override
Definition: audiostream.h:483
void queuePacket(Common::SeekableReadStream *data) override
Definition: audiostream.h:491
void finish() override
Definition: audiostream.h:492
virtual AudioStream * makeStream(Common::SeekableReadStream *data)=0
StatelessPacketizedAudioStream(uint rate, uint channels)
Definition: audiostream.h:477
bool isStereo() const override
Definition: audiostream.h:482
Definition: audiostream.h:287
SubLoopingAudioStream(SeekableAudioStream *stream, uint loops, const Timestamp loopStart, const Timestamp loopEnd, DisposeAfterUse::Flag disposeAfterUse=DisposeAfterUse::YES)
int readBuffer(int16 *buffer, const int numSamples) override
void setRemainingIterations(uint loops) override
Definition: audiostream.h:315
uint getCompleteIterations() const override
Definition: audiostream.h:314
bool isStereo() const override
Definition: audiostream.h:311
int getRate() const override
Definition: audiostream.h:312
bool endOfData() const override
bool endOfStream() const override
Definition: audiostream.h:334
bool isStereo() const override
Definition: audiostream.h:348
SubSeekableAudioStream(SeekableAudioStream *parent, const Timestamp start, const Timestamp end, DisposeAfterUse::Flag disposeAfterUse=DisposeAfterUse::YES)
bool endOfStream() const override
Definition: audiostream.h:353
Timestamp getLength() const override
Definition: audiostream.h:357
bool seek(const Timestamp &where) override
bool endOfData() const override
Definition: audiostream.h:352
int getRate() const override
Definition: audiostream.h:350
int readBuffer(int16 *buffer, const int numSamples) override
Definition: timestamp.h:83
Definition: ptr.h:656
Definition: path.h:52
Definition: ptr.h:572
Definition: stream.h:745
AudioStream * makeLoopingAudioStream(RewindableAudioStream *stream, uint loops)
QueuingAudioStream * makeQueuingAudioStream(int rate, bool stereo)
Timestamp convertTimeToStreamPos(const Timestamp &where, int rate, bool isStereo)
AudioStream * makeSilentAudioStream(int rate, bool stereo)
AudioStream * makeLimitingAudioStream(AudioStream *parentStream, const Timestamp &length, DisposeAfterUse::Flag disposeAfterUse=DisposeAfterUse::YES)
AudioStream * makeNullAudioStream()
Definition: system.h:39
Definition: algorithm.h:29
Path
Definition: game.h:76