Хватит в блоге ерундой заниматься) Пора что-нить по-взрослому написать)
Не секрет, что после того как мы экземпляру класса Sound скажем play();, то он начнет отправляет событие sampleData, запрашивая новые аудиоданные, и это происходит только в том случае если он пустой.
Пожалуй, тут лучше всего начать с примера. Допустим нам очень захотелось послушать синусойду. А для этого нам достаточно пустого экземпляра класса Sound, одного слушателя события, одной функции.
//создаем экземпляр
var generSnd:Sound = new Sound();
//вешаем событие
generSnd.addEventListener(SampleDataEvent.SAMPLE_DATA, sinusGenerator);
//начинаем рассылать событие SAMPLE_DATA
generSnd.play();
//в этой функции мы создаем БайтМассв в который записываем нашу синусойду
function sinusGenerator(event:SampleDataEvent):void
{
for (var i:int = 0; i < 8192; i++)
{
var n:Number = Math.sin((i + event.position) / Math.PI / 4);
event.data.writeFloat(n);
event.data.writeFloat(n);
}
}
Тут всё легко и просто.
Теперь придумаем задачку посложнее. Допустим, нам требуется ускорить воспроизведение загруженного звука. Чуточку подумаем логически, как реализовать ускорение воспроизведения звука? Ну конечно, вы правильно подумали, смещением ByteArray!
//создаем пустой экземпляр саунда
var mySound:Sound = new Sound();
//загружаем наш звук, для ускорения воспроизведения
var sourceSnd:Sound = new Sound();
var urlReq:URLRequest = new URLRequest(«test.mp3″);
sourceSnd.load(urlReq);
sourceSnd.addEventListener(Event.COMPLETE, loaded);
function loaded(event:Event):void
{
//после того как мы загрузили нашу мп3-шку
//мы вешаем событие на пустой саунд
mySound.addEventListener(SampleDataEvent.SAMPLE_DATA, processSound);
mySound.play();
}
function processSound(event:SampleDataEvent):void
{
//создаем пустой ByteArray
var bytes:ByteArray = new ByteArray();
//заполняем его
sourceSnd.extract(bytes, 8192);
//изменяем наш ByteArray и воспроизводим
event.data.writeBytes(upOctave(bytes));
}
function upOctave(bytes:ByteArray):ByteArray
{
//ByteArray
var returnBytes:ByteArray = new ByteArray();
//начальная позиция 0
bytes.position = 0;
//пока мы можем писать байты
while(bytes.bytesAvailable > 0)
{
//мы их пишем
returnBytes.writeFloat(bytes.readFloat());
returnBytes.writeFloat(bytes.readFloat());
//и если байты до сих пор доступны, для того чтобы не сместить за пределы массива
if (bytes.bytesAvailable > 0)
{
//мы их и смещаем
bytes.position += 8;
}
}
return returnBytes;
}
Вот как-то примерно так.)
