2013-04-10 70 views
0

我真的用尽了我对这个问题的所有知识,所以我希望我的同伴能够帮助我?as3:在一个声道上静音按钮和音量滑块

我正在构建一个音频混音器,它有五个音轨,每个音轨有一个音量滑块和静音按钮。与每个音轨的开始/停止按钮相反,静音按钮的原因是,无论何时引入采样,所有采样都将同步。 该应用程序具有全局启动,停止和暂停按钮,这些按钮都可以正常工作,但无法使音量滑块和静音按钮在单个声道上串联工作。 如果我注释掉其他功能,音量滑块和静音按钮都将工作,但是当两者都在播放时,只有音量滑块可以工作。 我猜测有冲突,因为我有两个单独的变量使用soundTransform对象/类,但也许你可以解释一下这个难题? 这是我的一个曲目的代码...任何帮助appricated。

var mySound1:Sound1 = new Sound1(); 
var myChannel1:SoundChannel = new SoundChannel(); 
var volumeAdjust1:SoundTransform = new SoundTransform(); 
volumeAdjust1.volume = 0; 

mute_btn1.stop(); 
mute_btn1.addEventListener(MouseEvent.CLICK,togglemute_btn1); 

var Mute1:Boolean = false; 

function togglemute_btn1(event:MouseEvent) 
{ 
    if (Mute1) 
    { 
     mute_btn1.gotoAndStop(1); 
     volumeAdjust1.volume = 1; 
     myChannel1.soundTransform = volumeAdjust1; 
     Mute1 = false; 
    } 
    else 
    { 
     mute_btn1.gotoAndStop(2) 
     volumeAdjust1.volume = 0; 
     myChannel1.soundTransform = volumeAdjust1; 
     Mute1 = true; 
    } 

} 

/*if the section below is commented out then the mute_btn1 works fine 
otherwise the volume slider functions are dominent*/ 
var dragging1:Boolean = false; 
var mySliderLength1:uint = 300; 
var boundingBox1:Rectangle = new Rectangle(0,0,0,mySliderLength1); 
slider_mc1.knob_mc1.addEventListener(MouseEvent.MOUSE_DOWN, dragKnob1); 
stage.addEventListener(MouseEvent.MOUSE_UP, releaseKnob1); 
slider_mc1.knob_mc1.buttonMode = true; 

function dragKnob1(myEvent:Event):void 
{ 
    slider_mc1.knob_mc1.startDrag(false, boundingBox1); 
    dragging1 = true; 
    slider_mc1.knob_mc1.addEventListener(Event.ENTER_FRAME, adjustVolume1); 
} 

function releaseKnob1(myEvent:Event):void 
{ 
    if (dragging1) 
    { 
     slider_mc1.knob_mc1.stopDrag(); 
     dragging1 = false; 
    } 
} 

function adjustVolume1(myEvent:Event):void 
{ 
    var myVolume1:Number = slider_mc1.knob_mc1.y/mySliderLength1; 
    var myTransform1:SoundTransform = new SoundTransform(myVolume1); 

    if (myChannel1!=null) 
    { 
     myChannel1.soundTransform = myTransform1; 
    } 
} 

回答

1

您应该检查Mute1变量在你自己的听众,如果静音,然后体积= 0,否则将计算量。实际上,请在调用stopDrag()时删除您的输入框架侦听器。

function dragKnob1(myEvent:Event):void 
{ 
    slider_mc1.knob_mc1.startDrag(false, boundingBox1); 
    dragging1 = true; 
    slider_mc1.knob_mc1.addEventListener(Event.ENTER_FRAME, adjustVolume1); 
} 

function releaseKnob1(myEvent:Event):void 
{ 
    if (dragging1) 
    { 
     slider_mc1.knob_mc1.stopDrag(); 
     dragging1 = false; 
     slider_mc1.knob_mc1.removeEventListener(Event.ENTER_FRAME, adjustVolume1); 
     //^this line added 
    } 
} 

function adjustVolume1(myEvent:Event):void 
{ 
    if (Mute1) return; 
    //^and this line added 
    var myVolume1:Number = slider_mc1.knob_mc1.y/mySliderLength1; 
    var myTransform1:SoundTransform = new SoundTransform(myVolume1); 

    if (myChannel1!=null) 
    { 
     myChannel1.soundTransform = myTransform1; 
    } 
} 
+0

谢谢Vesper,你的两行代码实际上彼此独立工作,但我已经把它们都留在了,因为如果静音按钮处于活动状态,我可以看到调整音量功能可能会混淆的地方。 – 2013-04-10 14:59:40

+1

玩过它后,我发现如果我忽略了这一行:if(Mute1)return; 。当我移动滑块时,它会自动取消静音,即使mute_btn1状态仍然显示为on,这样非常有帮助。 我现在唯一的问题是,当我取消静音轨道时,它会以全音量返回,而不是以前由滑块指定的音量! – 2013-04-10 15:35:22

+0

这意味着您必须求助于取消静音部分中的滑块位置,而不是将该音量设置为1。 – Vesper 2013-04-10 16:38:39

1

我相信你的问题是你不断添加Enter_Frame监听器每次点击鼠标,但它永远不会被删除。所以即使松开旋钮后,adjustVolume1函数仍然会被调用(在调用静音切换功能后,会调用静音函数调用在帧上执行的任何操作)。

所以我怎么想我会处理这个给定的当前状态是将Enter_Frame监听器添加到dragKnob函数之外,并在adjustVolume1处理程序中检查dragging1是否为true,否则返回。

slider_mc1.knob_mc1.addEventListener(Event.ENTER_FRAME, adjustVolume1); 

function dragKnob1(myEvent:Event):void 
{ 
... 
} 

function adjustVolume1(myEvent:Event):void 
{ 
    if(!dragging1) 
     return; 
    ... 
} 
+0

感谢您的努力,肖恩,但我不能让你调整的工作,但你没有教育我的事实,一旦我称之为一个事件,可能需要再次释放之前,可以成功地进行了另一次事件。 作为一个说明,我实际上正在开发一个android设备的应用程序,所以如果我将所有事件都改为TouchEvent而不是MouseEvents,可能会改进应用程序的某些功能。 – 2013-04-10 15:41:39