Beispiel #1
0
RewindableAudioStream *makeWAVStream(Common::SeekableReadStream *stream, DisposeAfterUse::Flag disposeAfterUse) {
	int size, rate;
	byte flags;
	uint16 type;
	int blockAlign;

	if (!loadWAVFromStream(*stream, size, rate, flags, &type, &blockAlign)) {
		if (disposeAfterUse == DisposeAfterUse::YES)
			delete stream;
		return 0;
	}

	if (type == 17) // MS IMA ADPCM
		return makeADPCMStream(stream, disposeAfterUse, size, Audio::kADPCMMSIma, rate, (flags & Audio::FLAG_STEREO) ? 2 : 1, blockAlign);
	else if (type == 2) // MS ADPCM
		return makeADPCMStream(stream, disposeAfterUse, size, Audio::kADPCMMS, rate, (flags & Audio::FLAG_STEREO) ? 2 : 1, blockAlign);

	// Raw PCM. Just read everything at once.
	// TODO: More elegant would be to wrap the stream.
	byte *data = (byte *)malloc(size);
	assert(data);
	stream->read(data, size);

	if (disposeAfterUse == DisposeAfterUse::YES)
		delete stream;

	return makeRawStream(data, size, rate, flags);
}
Beispiel #2
0
RewindableAudioStream *makeWAVStream(Common::SeekableReadStream *stream, DisposeAfterUse::Flag disposeAfterUse) {
	int size, rate;
	byte flags;
	uint16 type;
	int blockAlign;

	if (!loadWAVFromStream(*stream, size, rate, flags, &type, &blockAlign)) {
		if (disposeAfterUse == DisposeAfterUse::YES)
			delete stream;
		return 0;
	}

	if (type == 1) {
		// Raw PCM, make sure the last packet is complete
		uint sampleSize = (flags & Audio::FLAG_16BITS ? 2 : 1) * (flags & Audio::FLAG_STEREO ? 2 : 1);
		if (size % sampleSize != 0) {
			warning("makeWAVStream: Trying to play a WAVE file with an incomplete PCM packet");
			size &= ~(sampleSize - 1);
		}
	}

	Common::SeekableReadStream *substream = new Common::SeekableSubReadStream(stream, stream->pos(), stream->pos() + size, disposeAfterUse);

	switch (type) {
	case 1:
		// PCM
		return makePCMStream(substream, rate, flags);
	case 2:
		// MS ADPCM
		return makeADPCMStream(substream, DisposeAfterUse::YES, Audio::kADPCMMS, rate, (flags & Audio::FLAG_STEREO) ? 2 : 1, blockAlign);
	case 17:
		// MS IMA ADPCM
		return makeADPCMStream(substream, DisposeAfterUse::YES, Audio::kADPCMMSIma, rate, (flags & Audio::FLAG_STEREO) ? 2 : 1, blockAlign);
	default:
		// Unknown
		return 0;
	}
}
Beispiel #3
0
AudioStream *makeWAVStream(Common::File &stream) {
    int size, rate;
    byte flags;
    uint16 type;
    int blockAlign;

    if (!loadWAVFromStream(stream, size, rate, flags, &type, &blockAlign))
        return 0;

    if (type == 17) // MS IMA ADPCM
        return makeADPCMStream(&stream, size, kADPCMMSIma, rate, (flags & Audio::Mixer::FLAG_STEREO) ? 2 : 1);
    if (type == 2) // MS ADPCM
        return makeADPCMStream(&stream, size, kADPCMMS, rate, (flags & Audio::Mixer::FLAG_STEREO) ? 2 : 1, blockAlign);

    byte *data = (byte *)malloc(size);
    assert(data);
    stream.read_noThrow(data, size);

    // Since we allocated our own buffer for the data, we must set the autofree flag.
    flags |= Audio::Mixer::FLAG_AUTOFREE;

    return makeLinearInputStream(rate, flags, data, size, 0, 0);
}