NEPHILIM_NS_BEGIN //////////////////////////////////////////////////////////////////////////////// bool SoundBufferRecorder::onStart() { m_samples.clear(); m_buffer = SoundBuffer(); return true; }
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]); }
int SoundContainer::addProducer(int id) { this->_lockOutput->lock(); ++this->_producerCount; std::map<int, SoundBuffer>::iterator it = this->_voices.find(id); if (it != this->_voices.end()) { throw std::exception(); this->_lockOutput->unLock(); } this->_voices[id] = SoundBuffer(); this->_lockOutput->unLock(); return (1); }
CSound* CFModExDriver::getFmodExSound(const std::string& filename,const bool& stream) { FMOD_SOUND* resultingSound = 0; TLoadedSounds::iterator i = _sounds.find( filename ); /* for(TLoadedSounds::iterator i(_sounds.begin()),end(_sounds.end()); i != end; ++i){ if( i->second.sound == _sounds.end() ){ } */ // If if( i == _sounds.end() ){ _INFO << "Sound [" << filename << "] not loaded yet"; resultingSound = loadFmodExSound( filename, false ); if( ! resultingSound ){ //return i->second; _LOG_ERROR << "Could not load sound [" << filename << "]"; return 0; } else { //i = _INFO << "Audio file [" << filename << "] loaded"; std::pair<TLoadedSounds::iterator,bool> result = _sounds.insert( std::make_pair( filename, SoundBuffer(resultingSound) ) ) ; i = result.first; } } else { i->second.references++; } CSound* sound = new CSound( *this, i->second.getSound(), filename ); // Adds a reference toward the sound return sound ; }