Ses örneği: Podcast OynatıcısıFlash Player 9 ve üstü, Adobe AIR 1.0 ve üstü Podcast, istek üzerine veya abonelik yoluyla Internet üzerinden dağıtılan bir ses dosyasıdır. Podcast'ler genellikle podcast kanalı olarak da bilinen serilerin bir parçası olarak yayınlanır. Podcast bölümleri bir dakika ile birkaç saat arasında değişebildiğinden genellikle oynatılırken akışa alınır. Öğe olarak da adlandırılan podcast bölümleri genellikle mp3 biçiminde sunulur. Video podcast'leri de çok sık kullanılır ancak bu örnek uygulama yalnızca mp3 dosyaları kullanan ses podcast'lerini oynatır. Bu örnek tam özellikli bir podcast toplayıcı uygulama değildir. Örneğin, bu belirli podcast'lere abonelikleri yönetmez veya uygulama bir sonraki defa çalıştırıldığında kullanıcının hangi podcast'leri dinlediğini hatırlamaz. Bu daha tam özellikli bir podcast toplayıcısı için başlangıç noktası görevi görür. Podcast Player örneği, şu ActionScript programlama tekniklerini gösterir:
Bu örneğin uygulama dosyalarını edinmek için bkz. www.adobe.com/go/learn_programmingAS3samples_flash_tr. Podcast Player uygulama dosyalarını Samples/PodcastPlayer klasöründe bulabilirsiniz. Uygulama aşağıdaki dosyaları içerir:
Podcast kanalı için RSS verilerini okumaPodcast Player uygulaması, çok sayıda podcast kanalı ve bölümleri hakkında bilgiler okunarak başlatılır: 1. İlk olarak uygulama, podcast kanallarının listesini içeren bir XML konfigürasyon dosyasını okur ve kanalların listesini kullanıcıya görüntüler. 2. Kullanıcı podcast kanallarından birini seçtiğinde, kanalın RSS beslemesini okur ve kanal bölümlerinin listesini görüntüler. Bu örnek, uzak bir konumdan veya yerel dosyadan metin tabanlı verileri almak için URLLoader yardımcı program sınıfını kullanır. Podcast Player ilk olarak playerconfig.xml dosyasından RSS beslemelerinin listesini XML biçiminde almak için bir URLLoader nesnesi oluşturur. Daha sonra kullanıcı listeden belirli bir beslemeyi seçtiğinde, o beslemenin URL'sinden RSS verilerini okumak için yeni bir URLLoader nesnesi oluşturulur. SoundFacade sınıfını kullanarak ses yüklemesini ve çalınmasını basitleştirmeActionScript 3.0 ses mimarisi güçlü ancak karmaşıktır. Yalnızca temel ses yükleme ve çalma özelliklerine ihtiyaç duyan uygulamalar, daha basit bir yöntem çağrıları ve olayları kümesi sağlayarak karmaşıklığın bir kısmını gizleyen bir sınıfı kullanabilir. Yazılım tasarımı modelleri dünyasında bu sınıf cephe olarak adlandırılır. SoundFacade sınıfı, şu görevlerin gerçekleştirilmesine yönelik tek bir arabirim sunar:
SoundFacade sınıfı, ActionScript ses sınıflarının en çok sayıda işlevini en az karmaşıklıkta sunmaya çalışır. Aşağıdaki sınıf, sınıf bildirimini, sınıf özelliklerini ve SoundFacade() yapıcı yöntemini gösterir: public class SoundFacade extends EventDispatcher { public var s:Sound; public var sc:SoundChannel; public var url:String; public var bufferTime:int = 1000; public var isLoaded:Boolean = false; public var isReadyToPlay:Boolean = false; public var isPlaying:Boolean = false; public var isStreaming:Boolean = true; public var autoLoad:Boolean = true; public var autoPlay:Boolean = true; public var pausePosition:int = 0; public static const PLAY_PROGRESS:String = "playProgress"; public var progressInterval:int = 1000; public var playTimer:Timer; public function SoundFacade(soundUrl:String, autoLoad:Boolean = true, autoPlay:Boolean = true, streaming:Boolean = true, bufferTime:int = -1):void { this.url = soundUrl; // Sets Boolean values that determine the behavior of this object this.autoLoad = autoLoad; this.autoPlay = autoPlay; this.isStreaming = streaming; // Defaults to the global bufferTime value if (bufferTime < 0) { bufferTime = SoundMixer.bufferTime; } // Keeps buffer time reasonable, between 0 and 30 seconds this.bufferTime = Math.min(Math.max(0, bufferTime), 30000); if (autoLoad) { load(); } } SoundFacade sınıfı, kendi olaylarını gönderebilecek şekilde EventDispatcher sınıfını genişletir. Sınıf kodu ilk olarak bir Sound nesnesi ve bir SoundChannel nesnesi için özellikleri bildirir. Bu sınıf ayrıca ses dosyasının URL'sinin değerini ve ses akışa alınırken kullanılacak bufferTime özelliğini içerir. Üstelik yükleme ve çalma davranışını etkileyen bazı Boolean parametrelerini de kabul eder:
bufferTime parametresinin varsayılan değeri -1'dir. Yapıcı yöntemi bufferTime parametresinde negatif bir değer algılarsa, bufferTime özelliğini SoundMixer.bufferTime değerine ayarlar. Bu, istendiği zaman uygulamanın genel SoundMixer.bufferTime değerini varsayılan olarak uygulamasına olanak sağlar. autoLoad parametresi true değerine ayarlanırsa, ses dosyasının yüklemesini başlatmak için yapıcı yöntemi hemen şu load() yöntemini çağırır: public function load():void { if (this.isPlaying) { this.stop(); this.s.close(); } this.isLoaded = false; this.s = new Sound(); this.s.addEventListener(ProgressEvent.PROGRESS, onLoadProgress); this.s.addEventListener(Event.OPEN, onLoadOpen); this.s.addEventListener(Event.COMPLETE, onLoadComplete); this.s.addEventListener(Event.ID3, onID3); this.s.addEventListener(IOErrorEvent.IO_ERROR, onIOError); this.s.addEventListener(SecurityErrorEvent.SECURITY_ERROR, onIOError); var req:URLRequest = new URLRequest(this.url); var context:SoundLoaderContext = new SoundLoaderContext(this.bufferTime, true); this.s.load(req, context); } load() yöntemi yeni bir Sound nesnesi oluşturur ve sonra tüm önemli ses olayları için dinleyiciler ekler. Daha sonra Sound nesnesine, bufferTime değerinde iletmek üzere SoundLoaderContext nesnesini kullanarak ses dosyasını yüklemesini bildirir. url özelliği değiştirilebildiğinden, art arda farklı ses dosyalarını çalmak için SoundFacade örneği kullanılabilir: yalnızca url özelliğinin değiştirilip load() yönteminin çağrılması sonucunda yeni ses dosyası yüklenmiş olur. Aşağıdaki olay dinleyicisi yöntemleri, SoundFacade nesnesinin yükleme ilerlemesini nasıl izlediğini ve ses çalmasını başlatmaya nasıl karar verdiğini gösterir: public function onLoadOpen(event:Event):void { if (this.isStreaming) { this.isReadyToPlay = true; if (autoPlay) { this.play(); } } this.dispatchEvent(event.clone()); } public function onLoadProgress(event:ProgressEvent):void { this.dispatchEvent(event.clone()); } public function onLoadComplete(event:Event):void { this.isReadyToPlay = true; this.isLoaded = true; this.dispatchEvent(evt.clone()); if (autoPlay && !isPlaying) { play(); } } Ses yüklemesi başladığında onLoadOpen() yöntemi çalıştırılır. Akışa alma modunda ses çalınabiliyorsa, onLoadComplete() yöntemi hemen isReadyToPlay bayrağını true değerine ayarlar. isReadyToPlay bayrağı, uygulamanın, belki de Oynat/Çal düğmesinin tıklatılması gibi bir kullanıcı eylemine yanıt olarak ses çalmasını başlatıp başlatamayacağını belirler. SoundChannel sınıfı, ses verilerinin arabelleğe alınmasını yönetir, bu nedenle play() yöntemi çağrılmadan önce yeterince veri yüklenmiş olup olmadığını açıkça kontrol etmeye gerek yoktur. onLoadProgress() yöntemi, yükleme işlemi sırasında düzenli aralıklarla çalıştırılır. Bu SoundFacade nesnesini kullanan kod tarafından kullanılmak üzere ProgressEvent nesnesinin bir klonunu gönderir. Ses verileri tamamen yüklendiğinde onLoadComplete() yöntemi çalıştırılarak gerektiğinde akışa alınmayan sesler için play() yöntemini çağırır. play() yöntemi aşağıda gösterilmiştir. public function play(pos:int = 0):void { if (!this.isPlaying) { if (this.isReadyToPlay) { this.sc = this.s.play(pos); this.sc.addEventListener(Event.SOUND_COMPLETE, onPlayComplete); this.isPlaying = true; this.playTimer = new Timer(this.progressInterval); this.playTimer.addEventListener(TimerEvent.TIMER, onPlayTimer); this.playTimer.start(); } } } play() yöntemi, ses çalınmaya hazır olduğunda Sound.play() yöntemini çağırır. Sonuçta elde edilen SoundChannel nesnesi, sc özelliğinde saklanır. Daha sonra play() yöntemi, düzenli aralıklarla çalma ilerlemesi olaylarını göndermek için kullanılacak bir Timer nesnesini oluşturur. Çalma ilerlemesini görüntülemeÇalmayı izlemek için bir Timer nesnesinin oluşturulması, yalnızca bir defa kodlamanız gereken karmaşık bir işlemdir. Bu Timer mantığının SoundFacade sınıfı gibi yeniden kullanılabilir bir sınıfta kapsüllenmesi, bir ses yüklenirken ve çalınırken uygulamaların aynı türdeki ilerleme olaylarını dinlemesine olanak sağlar. SoundFacade.play() yöntemi tarafından oluşturulan Timer nesnesi, her saniye bir TimerEvent örneği gönderir. Aşağıdaki onPlayTimer() yöntemi, her yeni bir TimerEvent geldiğinde çalıştırılır: public function onPlayTimer(event:TimerEvent):void { var estimatedLength:int = Math.ceil(this.s.length / (this.s.bytesLoaded / this.s.bytesTotal)); var progEvent:ProgressEvent = new ProgressEvent(PLAY_PROGRESS, false, false, this.sc.position, estimatedLength); this.dispatchEvent(progEvent); } onPlayTimer() yöntemi, Çalmayı izleme bölümünde açıklanan boyut tahmini tekniğini uygular. Daha sonra bytesLoaded özelliği, SoundChannel nesnesinin geçerli konumuna ve bytesTotal özelliği de ses verisinin tahmini uzunluğuna ayarlanmış şekilde, SoundFacade.PLAY_PROGRESS olay türünde yeni bir ProgressEvent örneği oluşturur. Çalmayı duraklatma ve yeniden başlatmaÖnceden gösterilen SoundFacade.play() yöntemi, ses verisindeki bir başlangıç konumuna karşılık gelen pos parametresini kabul eder. pos değeri sıfır olursa, ses baştan çalınmaya başlar. SoundFacade.stop() yöntemi burada gösterildiği gibi bir pos parametresini de kabul eder: public function stop(pos:int = 0):void { if (this.isPlaying) { this.pausePosition = pos; this.sc.stop(); this.playTimer.stop(); this.isPlaying = false; } } SoundFacade.stop() yöntemi her çağrıldığında pausePosition özelliğini ayarlar, böylece kullanıcı aynı sesin çalınmasını yeniden başlatmak istediğinde uygulama da oynatma kafasının nerede konumlandırıldığını bilir. Aşağıda gösterilen SoundFacade.pause() ve SoundFacade.resume() yöntemleri sırayla SoundFacade.stop() ve SoundFacade.play() yöntemlerini çağırarak her seferinde bir pos parametre değerini iletir. public function pause():void { stop(this.sc.position); } public function resume():void { play(this.pausePosition); } pause() yöntemi geçerli SoundChannel.position değerini play() yöntemine iletir ve böylece bu değer pausePosition özelliğinde saklanır. resume() yöntemi, pausePosition değerini başlangıç noktası olarak kullanarak aynı sesin tekrar çalınmasını sağlar. Podcast Player örneğini genişletmeBu örnek, yeniden kullanılabilir SoundFacade sınıfının kullanılmasını gösteren temel bir Podcast Player uygulamasını sunmaktadır. Bu uygulamanın kullanışlılığını artırmak için aşağıdaki gibi başka ek özellikler de ekleyebilirsiniz:
|
|