package {
import cmodule.oggvorbis.CLibInit;
import flash.display.Sprite;
import flash.events.SampleDataEvent;
import flash.media.Sound;
import flash.media.SoundChannel;
import flash.utils.ByteArray;
import flash.utils.Endian;
public class Test extends Sprite{
[Embed(source="C:/Test.ogg",mimeType="application/octet-stream")] //Path to the imported OGG file, which is stored as byte array
private var MUSIC_DATA:Class; //Class of the imported file
private var _decoder:* //OGG Decoder
private var _audio_clip:Sound //The dynamically generated Sound of the imported file
private var _audio_id:Number //ID of the decoded file, for Decoder use
private var _audio_bytearray:ByteArray //Bytearray of the imported OGG file
private var _audio_info:Object=new Object //Informations about the imported OGG file
private var temp_array:ByteArray //Temporary variable, stores audio data on fly
private var data_read_size:Number //Temporary variable used for converting
private var sample_read_size:Number //Temporary variable used for converting
private const num_of_samples:Number=4096 //Constant
public function Test(){
var clib:CLibInit=new CLibInit(); //Instantation of the CLib
_decoder=clib.init(); //Initialize the CLib and store the OGG Decoder
_audio_clip=new Sound; //Create new Sound to hold the audio data
_audio_clip.addEventListener("sampleData", onSamplesRequest); //MOST CRUCIAL LINE - adds listener to catch event when the music is to be converted
_audio_bytearray=(new MUSIC_DATA) as ByteArray //Create the bytearray of the import OGG
_audio_id=_decoder.setupDecoder(_audio_bytearray, _audio_bytearray.length); //Prepare the decoder to decoding the OGG File
var infoObj:Object = _decoder.getHeader(_audio_id); //Get some information about the OGG file
_audio_info.format = "PCM";
_audio_info.channels = infoObj.channels;
_audio_info.sampleRate = infoObj.sampleRate;
_audio_info.sampleMultiplier = 44100 / infoObj.sampleRate;
_audio_info.bitRateUpper = infoObj.bitRateUpper;
_audio_info.bitRateLower = infoObj.bitRateLower;
_audio_info.bitRateNominal = infoObj.bitRateNominal;
_audio_info.bitsPerSample = 16;
_audio_info.blockAlign = _audio_info.channels * 2;
_audio_clip.play() //Play the Sound
}
private function onSamplesRequest(event:SampleDataEvent):void {
temp_array=new ByteArray
temp_array.endian = Endian.LITTLE_ENDIAN
//This part generally fills temo_array with decoded audio, and sets data_read_size to the amount of data processed
data_read_size=_decoder.getSampleData(_audio_id, num_of_samples*_audio_info.blockAlign/_audio_info.sampleMultiplier, temp_array)
temp_array.position=0
sample_read_size = data_read_size/_audio_info.blockAlign;
if (_audio_info.channels==1){ //Convert the decoder's output to Flash friendly audio output
convertMono(event)
} else {
convertStereo(event)
}
var i:uint;
var j:uint;
//Fill the empty space with zeroes if needed.
for (i=sample_read_size * _audio_info.sampleMultiplier; i<num_of_samples; ++i) {
event.data.writeFloat(0);
event.data.writeFloat(0);
}
}
private function convertMono(event:SampleDataEvent):void{
var i:uint;
var j:uint;
var sample:Number;
for (i=0; i<sample_read_size; ++i) {
if (temp_array.position==temp_array.length){break}
sample = temp_array.readShort() / 32767;
for (j=0; j<_audio_info.sampleMultiplier; ++j) {
event.data.writeFloat(sample);
event.data.writeFloat(sample);
}
}
}
private function convertStereo(event:*):void{
var i:uint;
var j:uint;
var sample:Number;
for (i=0; i<sample_read_size; ++i) {
sample = temp_array.readShort() / 32767;
for (j=0; j< _audio_info.sampleMultiplier; ++j) {
event.data.writeFloat(sample);
}
sample = temp_array.readShort() / 32767;
for (j=0; j< _audio_info.sampleMultiplier; ++j) {
event.data.writeFloat(sample);
}
}
}
}
}