19 de enero de 2010

Cómo controlar el volumen en una aplicación de manera global.

Hey saludos a todos, tiempo tiempo sin postear nada nuevo más que los iconitos que conseguí de flex builder, en fin.

Si han tenido la necesidad de trabajar con sonido en sus aplicaciones habrán visto que la manera más sencilla según la ayuda de flex es con la clase Sound

request("click.mp3"); var s:Sound = new Sound(req);


Bien, eso funciona.. si quieres bajar o subir el volumen de ese sonido en particular usamos SoundTransform aplicado a ese canal de sonido, algo así



var snd:Sound = new Sound(new URLRequest("bigSound.mp3")); 

var trans:SoundTransform = new SoundTransform(0.6, -1);


Pero.. que pasa cuando queremos bajar el volumen para toda nuestra aplicación y no solo para ese sound, fácil, usando SoundMixer y aplicando un SoundTransform



SoundMixer.soundTransform = new SoundTransform(1, -1);


Por ejemplo si queremos usar un HSlider o VSlider para subir y bajar el volumen de manera global en nuestra aplicación haríamos lo siguiente:



Este ejemplo incrusta (Embed) el sonido dentro de una Clase, pero lo importante es el uso de la clase estática SoundMixer para el control del volumen.



<?xml version="1.0" encoding="utf-8"?>

<!--Ejemplo de como controlar el nivel de volumen globalmente para una aplicación -->
<!--Creado por Pedro Varela para Flex en español-->
<mx:Application
xmlns:mx="http://www.adobe.com/2006/mxml"
layout="vertical" styleName="plain" horizontalAlign="center" verticalAlign="middle"
applicationComplete="loadSound();">

<mx:Script>
<![CDATA[
[Embed(source="armin.mp3")]
private var soundClass:Class;

[Bindable]
private var armin:Sound;

[Bindable]
private var channel:SoundChannel;

private function loadSound():void{
armin = new soundClass() as Sound;
}

private function play():void{
channel = armin.play();
channel.addEventListener(Event.SOUND_COMPLETE, onFinishSong);
repro.enabled=false;
}

private function stop():void{
SoundMixer.stopAll();
repro.enabled=true;
}

private function onChangeVolSlider(event:Event):void{
SoundMixer.soundTransform = new SoundTransform(event.currentTarget.value);
}

private function onFinishSong(event:Event):void{
deten.enabled = false;
repro.enabled = true;
}
]]>
</mx:Script>

<mx:Grid>
<mx:GridRow width="100%" height="100%">
<mx:GridItem width="100%" height="100%" horizontalAlign="center" verticalAlign="middle">
<mx:Button id="repro" label="Reproducir" click="{play()}"/>
<mx:Button id="deten" label="Detener" click="{stop()}"/>
</mx:GridItem>
</mx:GridRow>
<mx:GridRow width="100%" height="100%">
<mx:GridItem width="100%" horizontalAlign="center" verticalAlign="middle">
<mx:HSlider minimum="0" maximum="1" labels="[0,50,100]" height="42" id="volSlid" change="onChangeVolSlider(event)" showDataTip="false" liveDragging="true" allowTrackClick="true" value="1"/>
</mx:GridItem>
</mx:GridRow>
</mx:Grid>
</mx:Application>