Пример #1
0
void MainWindow::exportWAVImpl(Sound::AudioStream *sound, Common::WriteStream &wav) {
	assert(sound);

	const uint16 channels = sound->getChannels();
	const uint32 rate     = sound->getRate();

	std::deque<SoundBuffer> buffers;

	uint64 length = getSoundLength(sound);
	if (length != Sound::RewindableAudioStream::kInvalidLength)
		buffers.resize((length / (SoundBuffer::kBufferSize / channels)) + 1);

	uint32 samples = 0;
	std::deque<SoundBuffer>::iterator buffer = buffers.begin();
	while (!sound->endOfStream()) {
		if (buffer == buffers.end()) {
			buffers.push_back(SoundBuffer());
			buffer = --buffers.end();
		}

		buffer->samples = sound->readBuffer(buffer->buffer, SoundBuffer::kBufferSize);

		if (buffer->samples > 0)
			samples += buffer->samples;

		++buffer;
	}

	samples /= channels;

	const uint32 dataSize   = samples * channels * 2;
	const uint32 byteRate   = rate * channels * 2;
	const uint16 blockAlign = channels * 2;

	wav.writeUint32BE(MKTAG('R', 'I', 'F', 'F'));
	wav.writeUint32LE(36 + dataSize);
	wav.writeUint32BE(MKTAG('W', 'A', 'V', 'E'));

	wav.writeUint32BE(MKTAG('f', 'm', 't', ' '));
	wav.writeUint32LE(16);
	wav.writeUint16LE(1);
	wav.writeUint16LE(channels);
	wav.writeUint32LE(rate);
	wav.writeUint32LE(byteRate);
	wav.writeUint16LE(blockAlign);
	wav.writeUint16LE(16);

	wav.writeUint32BE(MKTAG('d', 'a', 't', 'a'));
	wav.writeUint32LE(dataSize);

	for (std::deque<SoundBuffer>::const_iterator b = buffers.begin(); b != buffers.end(); ++b)
		for (int i = 0; i < b->samples; i++)
			wav.writeUint16LE(b->buffer[i]);
}
Пример #2
0
void checkEndSound()
{
	if(getMode() != SOUNDPLAYER)
	{
		return;
	}
	
	if(!soundLoaded)
	{
		char ext[256];
		char tmp[256];
		
		strcpy(tmp,getFileName());
		separateExtension(tmp,ext);
		strlwr(ext);
		
		if(strcmp(ext,".pls") == 0 || strcmp(ext,".m3u") == 0)
		{	
			sndMode = TYPE_PLS;
			if(loadPlaylist(getFileName(), &curPlaylist))
			{
				DRAGON_chdir("/");
				loadSound(curPlaylist.urlEntry[0].data);
				plsPos = 0;
			}
			else
			{
				destroyRandomList();
				exitSound(0,0);
				return;
			}
		}
		else
		{
			sndMode = TYPE_NORMAL;
			
			bool success = loadSound(getFileName());
			
			if(soundMode == SOUND_ONESHOT || firstTime)
			{
				if(success == false)
				{
					destroyRandomList();
					exitSound(0,0);
					
					return;
				}
			}
			else
			{			
				while(!success)	
				{
					getNextSoundInternal(false);
					
					if(getMode() == BROWSER) // cover for no files found
					{	
						destroyRandomList();
						
						return;
					}
					
					success = loadSound(getFileName());
				}
			}
		}
		
		sampleWidth = (getSoundLength() / 236);
		soundLoaded = true;
	}
	
	firstTime = false;
	
	if(getState() == STATE_STOPPED || getState() == STATE_UNLOADED)
	{
		if(sndMode == TYPE_NORMAL)
		{
			if(soundMode == SOUND_ONESHOT)
			{
				exitSound(0,0);
			}
			else
			{
				getNextSoundInternal(true);
			}
		}
		if(sndMode == TYPE_PLS)
		{
			if(!queued)
			{
				if(plsPos == curPlaylist.numEntries - 1)
					plsPos = 0;
				else
					plsPos++;
			}
			
			DRAGON_chdir("/");
			loadSound(curPlaylist.urlEntry[plsPos].data);
			
			queued = false;
		}		
	}
}