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]); }
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; } } }