2011-06-01 122 views
2

看來,如果有一個麥克風可用,那麼可以爲StatusEvent添加一個事件監聽器。但是,這隻會告訴你話筒是否被允許或禁止。如何檢測新麥克風是否可用?

我真的很想做的是檢測是否靜態Microphone.names屬性更改。我本來期望這個屬性是可以綁定的。

如果我在插入麥克風後立即右鍵單擊並選擇「設置」,我可以看到閃光燈已更新其可用麥克風列表。但是,代碼似乎沒有辦法讓我獲得相同的更新。

該文檔說「調用Microphone.names需要廣泛的硬件檢查,並可能需要幾秒鐘來建立陣列。」所以我認爲每隔幾秒輪詢一次並不是一個可行的選擇。

+0

我不認爲運行時(Flash或AIR)暴露此信息。如果在插入新的麥克風後重新檢查,我會期待的。新的麥克風會被找到。但是,我不希望AIR或Flash告訴你這個系統細節已經改變。 – JeffryHouser 2011-06-01 14:23:41

回答

0

我跑一個小的測試腳本:

var ta:TextArea = new TextArea(); 
    ta.width = ta.height = 500; 
    addChild(ta); 
    var t:Timer = new Timer(5000); 
    t.addEventListener(TimerEvent.TIMER, function(e:Event):void{ 
     var t0:uint = getTimer(); 

     var m:* = Microphone.getMicrophone(); 

     ta.text += "mic found: "+(m?true:false)+" "+(getTimer()-t0); 

     t0 = getTimer(); 
     var o:* = Microphone.names; 
     ta.text += "\t\ttime to get names: "+(getTimer()-t0)+"\n"; 

    }); 
    t.start(); 

結果少於10ms的均次(getMicrophone是0-3ms,名稱爲2-9ms),這似乎相當快給我。我不知道,也許這是我的電腦,但似乎不是太密集。由於getMicrophone是我所需要的,沒有關於它的使用的官方警告,並且速度稍快,我將每隔幾秒輪詢一次getMicrophone來處理這個問題。

如果有人在這裏關心運行這個腳本,並對你的結果給予一些反饋,這可能會幫助我和其他人做出更好的選擇。

+0

你是對的,投票不會花很長時間來操作,特別是在5秒的時間間隔內。但是,我做了其他答案的想法並且只是回答自己。 – 2011-06-02 12:22:29

+0

我只是試圖讓這個線程對任何閱讀它的人都非常有用。在我看來,你的和joanllenas的答案都是完全正確的,所以把它們標記爲正確的會令人困惑。如果有更好的方法來實現這一點,那麼請告訴我。 這不是一個自我的競爭。標記答案,因爲你不喜歡那個回答的人對這個社區不會有幫助。 – cammil 2011-06-02 13:43:07

+0

如果你想使線程有用,你可以評論其他答案提及輪詢方法,並要求擴大這一點。 – 2011-06-02 13:52:22

-1

沒有像你說的那樣暴露此事的事件。 該屬性不可綁定,因爲麥克風是Flash播放器功能,而不是Flex麥克風包裝(因爲今天的綁定僅限於Flex)。

我建議你每隔幾秒輪詢Microphone.getMicrophone()並聲明它不爲null。這個調用比Microphone.names要少得多。

+0

-1。 Microphone.getMicrophone()不正確,無法綁定'閃光燈功能'。 – 2011-06-01 14:55:17

+0

1.綁定僅限Flex 2.麥克風是Flash Player功能。 – joanllenas 2011-10-28 13:08:10

+1

讓我解釋一下爲什麼你的回覆是錯誤的,爲什麼你給我的回答評分爲-1:ChangeWatcher只是flex,因爲它依賴於Binding機制。正如我所說的,Microphone不是Flex類,它是一個Flash Player類,這就是爲什麼它永遠不能連接到flex綁定機制。如果你想做這樣的事情,你必須創建一個包裝器,創建一個'名稱'屬性[Bindable],輪詢麥克風直到它準備好,然後更改'名稱'的值。然後,所有MicWrapper客戶都將被通知更改。我希望澄清我想說的話。 – joanllenas 2011-10-28 13:17:25

0

我不確定您是否可以在Microphone的'names'數組上設置更改觀察器,因爲如果對陣列的引用每次都更新(新數組),則觀察器將只會被調用。所以這是未經測試,但一些嘗試:

var watcher:ChangeWatcher = ChangeWatcher.watch(Microphone, ['names'], onNameChange); 

只需要創建onNameChange處理程序,看看它實際上被調用。如果這不起作用,那麼您需要每x次花費一次「輪詢」名稱。

+0

我試過了,它沒有工作。 – cammil 2011-06-01 21:34:25