AudioStream *AACDecoder::decodeFrame(Common::SeekableReadStream &stream) { // read everything into a buffer uint32 inBufferPos = 0; uint32 inBufferSize = stream.size(); byte *inBuffer = new byte[inBufferSize]; stream.read(inBuffer, inBufferSize); QueuingAudioStream *audioStream = makeQueuingAudioStream(_rate, _channels); // Decode until we have enough samples (or there's no more left) while (inBufferPos < inBufferSize) { NeAACDecFrameInfo frameInfo; void *decodedSamples = NeAACDecDecode(_handle, &frameInfo, inBuffer + inBufferPos, inBufferSize - inBufferPos); if (frameInfo.error != 0) throw Common::Exception("Failed to decode AAC frame: %s", NeAACDecGetErrorMessage(frameInfo.error)); byte *buffer = (byte *)malloc(frameInfo.samples * 2); memcpy(buffer, decodedSamples, frameInfo.samples * 2); byte flags = FLAG_16BITS; #ifdef XOREOS_LITTLE_ENDIAN flags |= FLAG_LITTLE_ENDIAN; #endif audioStream->queueAudioStream(makePCMStream(new Common::MemoryReadStream(buffer, frameInfo.samples * 2), _rate, flags, _channels, true), true); inBufferPos += frameInfo.bytesconsumed; } return audioStream; }
void QuickTimeAudioDecoder::init() { Common::QuickTimeParser::init(); _audioTrackIndex = -1; // Find an audio stream for (uint32 i = 0; i < _tracks.size(); i++) if (_tracks[i]->codecType == CODEC_TYPE_AUDIO && _audioTrackIndex < 0) _audioTrackIndex = i; // Initialize audio, if present if (_audioTrackIndex >= 0) { AudioSampleDesc *entry = (AudioSampleDesc *)_tracks[_audioTrackIndex]->sampleDescs[0]; if (entry->isAudioCodecSupported()) { _audStream = makeQueuingAudioStream(entry->_sampleRate, entry->_channels == 2); _curAudioChunk = 0; // Make sure the bits per sample transfers to the sample size if (entry->getCodecTag() == MKTAG('r', 'a', 'w', ' ') || entry->getCodecTag() == MKTAG('t', 'w', 'o', 's')) _tracks[_audioTrackIndex]->sampleSize = (entry->_bitsPerSample / 8) * entry->_channels; // Initialize the codec (if necessary) entry->initCodec(); } } }