1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143
|
/* ScummVM - Graphic Adventure Engine
*
* ScummVM is the legal property of its developers, whose names
* are too numerous to list here. Please refer to the COPYRIGHT
* file distributed with this source distribution.
*
* 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*
*/
/**
* Internal interface to the QuickTime audio decoder.
*
* This is available so that the QuickTimeVideoDecoder can use
* this directly.
*/
#ifndef AUDIO_QUICKTIME_INTERN_H
#define AUDIO_QUICKTIME_INTERN_H
#include "common/quicktime.h"
#include "common/scummsys.h"
#include "common/types.h"
#include "audio/audiostream.h"
namespace Common {
class SeekableReadStream;
class String;
}
namespace Audio {
class Codec;
class QuickTimeAudioDecoder : public Common::QuickTimeParser {
public:
QuickTimeAudioDecoder();
virtual ~QuickTimeAudioDecoder();
/**
* Load a QuickTime audio file
* @param filename the filename to load
*/
bool loadAudioFile(const Common::String &filename);
/**
* Load a QuickTime audio file from a SeekableReadStream
* @param stream the stream to load
*/
bool loadAudioStream(Common::SeekableReadStream *stream, DisposeAfterUse::Flag disposeFileHandle);
protected:
class QuickTimeAudioTrack : public SeekableAudioStream {
public:
QuickTimeAudioTrack(QuickTimeAudioDecoder *decoder, Track *parentTrack);
~QuickTimeAudioTrack();
// AudioStream API
int readBuffer(int16 *buffer, const int numSamples);
bool isStereo() const { return _queue->isStereo(); }
int getRate() const { return _queue->getRate(); }
bool endOfData() const;
// SeekableAudioStream API
bool seek(const Timestamp &where);
Timestamp getLength() const;
// Queue *at least* "length" audio
// If length is zero, it queues the next logical block of audio whether
// that be a whole edit or just one chunk within an edit
void queueAudio(const Timestamp &length = Timestamp());
Track *getParent() const { return _parentTrack; }
void queueRemainingAudio();
bool hasDataInQueue() const { return _samplesQueued != 0; }
private:
QuickTimeAudioDecoder *_decoder;
Track *_parentTrack;
QueuingAudioStream *_queue;
uint _curChunk;
Timestamp _curMediaPos, _skipSamples;
uint32 _curEdit, _samplesQueued;
bool _skipAACPrimer;
QueuingAudioStream *createStream() const;
AudioStream *readAudioChunk(uint chunk);
bool isOldDemuxing() const;
void skipSamples(const Timestamp &length, AudioStream *stream);
void findEdit(const Timestamp &position);
bool allDataRead() const;
void enterNewEdit(const Timestamp &position);
void queueStream(AudioStream *stream, const Timestamp &length);
uint32 getAudioChunkSampleCount(uint chunk) const;
Timestamp getChunkLength(uint chunk, bool skipAACPrimer = false) const;
uint32 getAACSampleTime(uint32 totalSampleCount, bool skipAACPrimer = false) const;
Timestamp getCurrentTrackTime() const;
};
class AudioSampleDesc : public Common::QuickTimeParser::SampleDesc {
public:
AudioSampleDesc(Common::QuickTimeParser::Track *parentTrack, uint32 codecTag);
~AudioSampleDesc();
bool isAudioCodecSupported() const;
AudioStream *createAudioStream(Common::SeekableReadStream *stream) const;
void initCodec();
// TODO: Make private in the long run
uint16 _bitsPerSample;
uint16 _channels;
uint32 _sampleRate;
uint32 _samplesPerFrame;
uint32 _bytesPerFrame;
private:
Codec *_codec;
};
// Common::QuickTimeParser API
virtual Common::QuickTimeParser::SampleDesc *readSampleDesc(Track *track, uint32 format, uint32 descSize);
void init();
Common::Array<QuickTimeAudioTrack *> _audioTracks;
};
} // End of namespace Audio
#endif
|