/** * Neave Microphone * * Copyright (C) 2008 Paul Neave * http://www.neave.com/ * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation at http://www.gnu.org/licenses/gpl.html */ package com.neave.media { import flash.events.*; import flash.media.*; import flash.system.*; import flash.utils.*; public class NeaveMicrophone { static private var mic:Microphone; static private var gainTimer:Timer; public function NeaveMicrophone() { } /** * Sets up and returns the microphone object * * @return A microphone object */ static public function getMicrophone():Microphone { // Return the same microphone if it has been successfully requested before if (mic != null) { if (mic.muted) Security.showSettings(SecurityPanel.PRIVACY); else NeaveMicrophone.startAutoGain(); return mic; } gainTimer = new Timer(100); // Get the microphone mic = Microphone.getMicrophone(); if (mic != null) { // Set properties if a microphone was found mic.setLoopBack(true); mic.rate = 44; mic.gain = 25; mic.setSilenceLevel(0); mic.setUseEchoSuppression(true); mic.soundTransform = new SoundTransform(0); // Mute microphone from sounding on speakers mic.addEventListener(StatusEvent.STATUS, NeaveMicrophone.statusListener); return mic; } else { // No microphone found Security.showSettings(SecurityPanel.MICROPHONE); return new Microphone(); } } /** * Microphone status response */ static private function statusListener(e:StatusEvent):void { if (e.code == "Microphone.Unmuted") NeaveMicrophone.startAutoGain(); else NeaveMicrophone.stopAutoGain(); } /** * Set up gain control */ static public function startAutoGain():void { gainTimer.start(); if (!gainTimer.hasEventListener(TimerEvent.TIMER)) gainTimer.addEventListener(TimerEvent.TIMER, setGain); } /** * Stop gain control */ static public function stopAutoGain():void { gainTimer.stop(); gainTimer.reset(); gainTimer.removeEventListener(TimerEvent.TIMER, setGain); } /** * Dynamically adjust the microphone's gain value */ static private function setGain(e:TimerEvent):void { if (mic.activityLevel < 15) mic.gain = 30; else if (mic.activityLevel > 90) mic.gain = 20; else mic.gain = 25; } } }