Not:
Flash Player 10 ve Adobe AIR 1.5'ten itibaren dinamik olarak ses oluşturma yeteneği kullanılabilir.
Varolan bir sesi yüklemek veya akışa almak yerine, dinamik olarak ses verisi oluşturabilirsiniz. Sound nesnesinin
sampleData
olayı için bir olay dinleyicisi atadığınızda ses verisi oluşturabilirsiniz. (
sampleData
olayı, flash.events paketindeki SampleDataEvent sınıfında tanımlanır.) Bu ortamda, Sound nesnesi bir dosyadan ses verilerini yüklemez. Onun yerine, bu olaya atadığınız işlevin kullanımı aracılığıyla kendisine akışa alınan ses verileri için bir soket görevi görür.
Bir Sound nesnesine
sampleData
olay dinleyicisi eklediğinizde, nesne düzenli aralıklarla ses arabelleğine eklemek için veriler ister. Bu arabellek, oynatılacak Sound nesnesinin verilerini içerir. Sound nesnesinin
play()
yöntemini çağırdığınızda, bu yöntem yeni ses verileri istenmesi durumunda
sampleData
olayını gönderir. (Bu yalnızca Sound nesnesi bir dosyadan mp3 verilerini yüklemediğinde gerçekleşir.)
SampleDataEvent nesnesi bir
data
özelliğine sahiptir. Olay dinleyicinizde, bu
data
nesnesine ByteArray nesnelerini yazarsınız. Bu nesneye yazdığınız bayt dizileri, Sound nesnesinin oynattığı ses verilerine eklenir. Arabellekteki bayt dizisi, -1 ile 1 arasında kayan nokta değerlerinin bir akışıdır. Her kayan nokta değeri, bir ses örneğinin tek bir kanalının genliğini (sol veya sağ) temsil eder. Ses, saniyede 44.100 örnek hızında örneklenir. Her örnek, bayt dizisinde kayan nokta verisi olarak araya eklenmiş bir sol ve sağ kanal içerir.
İşleyici işlevinizde,
sampleData
olayının
data
özelliğine yazmak için
ByteArray.writeFloat()
yöntemini kullanırsınız. Örneğin, şu kod bir sinüs dalgası oluşturur:
var mySound:Sound = new Sound();
mySound.addEventListener(SampleDataEvent.SAMPLE_DATA, sineWaveGenerator);
mySound.play();
function sineWaveGenerator(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);
}
}
Sound.play()
öğesini çağırdığınızda, uygulama olay dinleyicinizi çağırmaya başlayarak ses örneği verilerini ister. Siz veri sağlamayı durduruncaya kadar veya
SoundChannel.stop()
öğesini çağırıncaya kadar ses çalındığı sürece uygulama olay göndermeye devam eder.
Olayların gecikmesi platformdan platforma değişiklik gösterir ve Flash Player ve AIR uygulamasının gelecekteki sürümlerinde değişebilir. Belirli bir gecikmeye güvenmeyin; mutlaka gecikmeyi hesaplayın. Gecikmeyi hesaplamak için şu formülü kullanın:
(SampleDataEvent.position / 44.1) - SoundChannelObject.position
SampleDataEvent nesnesinin
data
özelliğine 2048 ile 8192 arasında örnek sağlayın (olay dinleyicisine yapılan her çağrı için). En iyi performans için mümkün olduğu kadar çok örnek sağlayın (en fazla 8192). Ne kadar az örnek sağlarsanız, oynatma sırasında o kadar çok tıklatma öğesi ve açılır pencere ortaya çıkar. Bu davranış çeşitli platformlarda değişiklik gösterebilir ve çeşitli durumlarda ortaya çıkabilir; örneğin, tarayıcıyı yeniden boyutlandırırken. Yalnızca 2048 örneği sağladığınızda tek bir platformda çalışan kod, farklı bir platformda çalıştırıldığında çalışmayabilir. Olası en düşük gecikme gerekiyorsa, veri miktarını kullanıcı tarafından seçilebilir duruma getirin.
2048'den daha az örnek (
sampleData
olay dinleyicisine yapılan her çağrı için) sağlarsanız, kalan örnekler çalıştırıldıktan sonra uygulama durdurulur. Ardından SoundChannel nesnesi bir SoundComplete olayı gönderir.