Code archives/Audio/Ogg Converter/Wav Saver
This code has been declared by its author to be Public Domain code.
Download source code
| |||||
Since loading Oggs can take a long time (10 secs or more for long tracks), I needed a better solution for handling big music files. Wavs are fine but very large file size making downloads very big. The solution - distribute with Oggs (minimal file size) and convert them to Wavs the first time the game/app is run, then load in the Wavs for faster load times. This code has been designed for this purpose although it can be easily modified for other situations where you might want to save sound data. The function loads the specified Ogg file and saves it to the specified Wav file. | |||||
Strict Local oggFile$ = RequestFile$("Load Ogg...", "Ogg Files:ogg") Local wavFile$ = RequestFile$("Save as...", "Wav files:wav", True) If oggToWav(oggFile$, wavFile$) Print "Wav file created." Else Print "Error, could not create wav file." End If End Function oggToWav(oggFile$, wavFile$) Local sndSample:TAudioSample, sampleSize, sndBank:TBank, fileStream:TStream Local channels, bitRate, blockAlign, fileSaved 'load the sound sndSample = LoadAudioSample(oggFile$) 'determine mono/stero If sndSample.format = SF_MONO8 Or sndSample.format = SF_MONO16LE Or sndSample.format = SF_MONO16BE Then channels = 1 Else channels = 2 End If 'determine bitrate & calculate size If sndSample.format = SF_MONO8 Or sndSample.format = SF_STEREO8 Then bitRate = 8 sampleSize = sndSample.length * channels Else bitRate = 16 sampleSize = sndSample.length * channels * 2 End If blockAlign = channels * bitRate / 8 'create a bank from the loaded sound sndBank = CreateStaticBank(sndSample.samples, sampleSize) 'create a stream to save data fileStream = WriteStream(wavFile$) If fileStream Then 'write wav header info fileStream.writeString("RIFF") '"RIFF" file description header (4 bytes) fileStream.writeInt(sampleSize + 40) 'file size - 8 (4 bytes) fileStream.writeString("WAVE") '"WAVE" description header (4 bytes) fileStream.writeString("fmt ") '"fmt " description header (4 bytes) fileStream.writeInt(16) 'size of WAVE section chunk (4 bytes) fileStream.writeShort(1) 'WAVE type format (2 bytes) fileStream.writeShort(channels) 'mono/stereo (2 bytes) fileStream.writeInt(sndSample.hertz) 'sample rate (4 bytes) fileStream.writeInt(sndSample.hertz * blockAlign) 'avg bytes/sec (4 bytes) fileStream.writeShort(blockAlign) 'Block alignment (2 bytes) fileStream.writeShort(bitRate) 'Bits/sample (2 bytes) fileStream.writeString("data") '"data" description header (4 bytes) fileStream.writeInt(sampleSize) 'size of data chunk (4 bytes) 'write wav sound data sndBank.Write(fileStream, 0, sampleSize) 'close the stream CloseStream fileStream fileSaved = True Else fileSaved = False End If 'free up mem fileStream = Null sndBank = Null sndSample = Null Return fileSaved End Function |
Comments
None.
Code Archives Forum