View difference between Paste ID: r9P87093 and
SHOW:
|
|
- or go back to the newest paste.
1 | - | |
1 | + | <?xml version="1.0" encoding="utf-8"?> |
2 | <mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" xmlns:custom="com.talknicer.*" | |
3 | layout="absolute" creationComplete="init()" width="400" height="206" | |
4 | backgroundColor="#C7C2C2" xmlns:components="components.*" | |
5 | xmlns:s="library://ns.adobe.com/flex/spark" | |
6 | > | |
7 | <mx:Script> | |
8 | <![CDATA[ | |
9 | import flash.events.*; | |
10 | import flash.media.*; | |
11 | import flash.net.*; | |
12 | import flash.utils.*; | |
13 | ||
14 | import mx.events.SliderEvent; | |
15 | ||
16 | ||
17 | public static const INACTIVE_STAT:int = 0; | |
18 | public static const PLAYBACK_STAT:int = 1; | |
19 | public static const RECORDING_STAT:int = 2; | |
20 | private var FLASH_SERVER:String = "rtmp://dev.llc.msu.edu/oflaDemo/RecordYourself"; | |
21 | ||
22 | ||
23 | private var _nc:NetConnection = null; | |
24 | private var _inStream:NetStream = null; | |
25 | private var _outStream:NetStream = null; | |
26 | ||
27 | private var _microphone:Microphone = null; | |
28 | ||
29 | private var _bConnected:Boolean = false; | |
30 | private var _iStatus:int = 0; | |
31 | private var _bMicReady:Boolean = false; | |
32 | private var _bNetworkReady:Boolean = false; | |
33 | ||
34 | private var _internalFilename:String = genRandomStr(15);; | |
35 | ||
36 | ||
37 | ||
38 | public function getStatus():int { | |
39 | return _iStatus; | |
40 | } | |
41 | ||
42 | public function get getMic():Microphone { | |
43 | return _microphone; | |
44 | } | |
45 | public function get fileName():String { | |
46 | return _internalFilename+".flv"; | |
47 | } | |
48 | ||
49 | private function setupMicrophone():void{ | |
50 | ||
51 | _microphone = Microphone.getMicrophone(); | |
52 | ||
53 | if (_microphone) { | |
54 | //_microphone.setLoopBack(true); | |
55 | _microphone.codec = SoundCodec.SPEEX; | |
56 | _microphone.encodeQuality = 10; | |
57 | _microphone.rate = 16;//44;renam | |
58 | _microphone.framesPerPacket = 2; | |
59 | _microphone.gain = 50; | |
60 | _microphone.setUseEchoSuppression(false); | |
61 | ||
62 | //_outStream.addEventListener(AsyncErrorEvent.ASYNC_ERROR, catchAll); | |
63 | //_outStream.addEventListener(IOErrorEvent.IO_ERROR, catchAll); | |
64 | ||
65 | ||
66 | //_microphone.rate = 16; // is this a choice?!? | |
67 | //_microphone.framesPerPacket = 2; | |
68 | //_microphone.gain = 50; | |
69 | //_microphone.setUseEchoSuppression(true); // I am hoping you can try this with both true and false | |
70 | ||
71 | _bMicReady = true; | |
72 | ||
73 | //outStream.attachAudio(mic); | |
74 | //outStream.publish("ttestaudio","record"); | |
75 | } | |
76 | } | |
77 | ||
78 | public function openConnection():Boolean{ | |
79 | ||
80 | _nc = new NetConnection(); | |
81 | _nc.client = this;//cl; | |
82 | _nc.addEventListener(NetStatusEvent.NET_STATUS, netStatus); | |
83 | _nc.addEventListener(AsyncErrorEvent.ASYNC_ERROR, catchAll); | |
84 | _nc.addEventListener(SecurityErrorEvent.SECURITY_ERROR, catchAll); | |
85 | ||
86 | _nc.connect(FLASH_SERVER); | |
87 | ||
88 | return true; | |
89 | } | |
90 | ||
91 | ||
92 | private function netStatus(event:NetStatusEvent):void { | |
93 | ||
94 | var info:Object = event.info; | |
95 | ||
96 | switch (info.code){ | |
97 | ||
98 | case "NetConnection.Connect.Success": | |
99 | _bNetworkReady = true; | |
100 | var ns:NetStream = new NetStream(_nc); | |
101 | ns.attachAudio(_microphone); | |
102 | break; | |
103 | ||
104 | case "NetConnection.Connect.Closed": | |
105 | closeConnection(); | |
106 | break; | |
107 | ||
108 | } | |
109 | ||
110 | } | |
111 | ||
112 | //private function onAsyncError(event:AsyncErrorEvent):void {} | |
113 | //private function onSecurityError(event:SecurityErrorEvent):void {} | |
114 | public function onBWDone():void{} | |
115 | ||
116 | public function onPlayStatus(info:Object):void{ | |
117 | trace("onPlayStatus:" + info.code); | |
118 | switch (info.code){ | |
119 | case "NetStream.Play.Complete": | |
120 | stopPlayback(); | |
121 | ||
122 | break; | |
123 | } | |
124 | } | |
125 | public function onMetaData(info:Object):void{ | |
126 | trace("getting meta data"); | |
127 | } | |
128 | ||
129 | private function catchAll(event:Object):void { | |
130 | if (event.type == "netStatus") { | |
131 | trace("catchAll:code:" + event.info.code); | |
132 | } else { | |
133 | trace("catchAll:event:" + event); | |
134 | } | |
135 | } | |
136 | ||
137 | private function playNetStatusHandler(event:NetStatusEvent):void { | |
138 | trace("my:"+event.info.code); | |
139 | switch (event.info.code) { | |
140 | case "NetStream.Pause.Notify": | |
141 | onVideoStop(null); | |
142 | //dispatchEvent(new Event(Event.COMPLETE)); | |
143 | break; | |
144 | } | |
145 | } | |
146 | ||
147 | public function closeConnection():void{ | |
148 | if (_nc) _nc.close(); | |
149 | _bNetworkReady = false; | |
150 | } | |
151 | ||
152 | public function startPlaybackClass( fn:String = "" ):Boolean{ | |
153 | ||
154 | if ( _bNetworkReady && _iStatus == INACTIVE_STAT ){ | |
155 | ||
156 | _outStream = new NetStream (_nc); | |
157 | _outStream.client = this; | |
158 | _outStream.addEventListener(AsyncErrorEvent.ASYNC_ERROR, catchAll); | |
159 | _outStream.addEventListener(IOErrorEvent.IO_ERROR, catchAll); | |
160 | _outStream.addEventListener(NetStatusEvent.NET_STATUS, playNetStatusHandler); | |
161 | ||
162 | if (fn == "") fn = _internalFilename; | |
163 | _outStream.play("flv:" + fn); | |
164 | ||
165 | _iStatus = PLAYBACK_STAT; | |
166 | ||
167 | } | |
168 | ||
169 | return false; | |
170 | ||
171 | } | |
172 | ||
173 | public function genRandomStr( len:int ):String { | |
174 | ||
175 | var tStr:String = new String(); | |
176 | var lookup:String = "abcdefghijklmnopqrstuvwxyz1234567890_"; | |
177 | for (var i:int = 0;i < len;i++){ | |
178 | tStr += lookup.charAt(Math.floor(Math.random()*lookup.length)); | |
179 | } | |
180 | ||
181 | return tStr; | |
182 | } | |
183 | ||
184 | public function startRecordClass():Boolean{ | |
185 | ||
186 | if (_bMicReady && _bNetworkReady && _iStatus == INACTIVE_STAT ){ | |
187 | _inStream = new NetStream(_nc); | |
188 | //_outStream.addEventListener(AsyncErrorEvent.ASYNC_ERROR, catchAll); | |
189 | //_outStream.addEventListener(IOErrorEvent.IO_ERROR, catchAll); | |
190 | _inStream.addEventListener(NetStatusEvent.NET_STATUS, catchAll); | |
191 | ||
192 | ||
193 | _inStream.attachAudio(_microphone); | |
194 | ||
195 | //_internalFilename = genRandomStr(15); | |
196 | ||
197 | _inStream.publish(_internalFilename,"record"); | |
198 | _iStatus = RECORDING_STAT; | |
199 | return true; | |
200 | } | |
201 | ||
202 | return false; | |
203 | } | |
204 | ||
205 | public function stopPlayback():void{ | |
206 | ||
207 | if (_iStatus == PLAYBACK_STAT ){ | |
208 | ||
209 | _outStream.pause(); | |
210 | _outStream.play(false); | |
211 | _iStatus = INACTIVE_STAT; | |
212 | ||
213 | } | |
214 | } | |
215 | ||
216 | public function stopRecord():void{ | |
217 | ||
218 | if (_inStream) _inStream.close(); | |
219 | _inStream = null; | |
220 | _iStatus = INACTIVE_STAT; | |
221 | ||
222 | } | |
223 | ||
224 | ||
225 | ||
226 | //---------------clases end | |
227 | ||
228 | ||
229 | public static const RECORD_LABEL:String = "Record"; | |
230 | public static const STOP_LABEL:String = "Stop"; | |
231 | public static const PLAY_LABEL:String = "Play"; | |
232 | ||
233 | public static const RECORD_STYLE:String = "recordStyle"; | |
234 | public static const STOP_STYLE:String = "stopStyle"; | |
235 | public static const PLAY_STYLE:String = "playStyle"; | |
236 | ||
237 | private var recSprite:Sprite = new Sprite(); | |
238 | private var stopRecSprite:Sprite = new Sprite(); | |
239 | private var stopSprite:Sprite = new Sprite(); | |
240 | private var playSprite:Sprite = new Sprite(); | |
241 | private var submitSprite:Sprite = new Sprite(); | |
242 | ||
243 | private function updateResultDisplay( str:String ):void { | |
244 | ||
245 | } | |
246 | ||
247 | private function init():void{ | |
248 | // Current release of FMS only understands AMF0 so tell Flex to | |
249 | NetConnection.defaultObjectEncoding = flash.net.ObjectEncoding.AMF0; | |
250 | SharedObject.defaultObjectEncoding = flash.net.ObjectEncoding.AMF0; | |
251 | //NetStream.defaultObjectEncoding = flash.net.ObjectEncoding.AMF0; | |
252 | ||
253 | openConnection(); | |
254 | setupMicrophone(); | |
255 | addEventListener(Event.ENTER_FRAME, showMicLevel); | |
256 | //_recorder.addEventListener(Event.COMPLETE, onVideoStop); | |
257 | var squareSize:uint = 10; | |
258 | ||
259 | //submitSprite.graphics.beginFill(0x00FF00); | |
260 | submitSprite.graphics.lineStyle(2,0x00FF00,1); | |
261 | submitSprite.graphics.moveTo(0,0); | |
262 | submitSprite.graphics.lineTo(squareSize/2,squareSize); | |
263 | submitSprite.graphics.lineTo(squareSize-2,0); | |
264 | submitSprite.x = 5; | |
265 | submitSprite.y = 5; | |
266 | //submitSprite.graphics.endFill(); | |
267 | ||
268 | playSprite.graphics.beginFill(0x000000); | |
269 | playSprite.graphics.moveTo(0,0); | |
270 | playSprite.graphics.lineTo(squareSize/2,squareSize/2); | |
271 | playSprite.graphics.lineTo(0,squareSize); | |
272 | playSprite.graphics.lineTo(0,0); | |
273 | playSprite.graphics.endFill(); | |
274 | playSprite.x=8; | |
275 | playSprite.y=5; | |
276 | ||
277 | ||
278 | stopRecSprite.graphics.beginFill(0x000000); | |
279 | stopRecSprite.graphics.drawRect(0, 0, squareSize, squareSize); | |
280 | stopRecSprite.graphics.endFill(); | |
281 | stopRecSprite.x=5; | |
282 | stopRecSprite.y=6; | |
283 | ||
284 | ||
285 | stopSprite.graphics.beginFill(0x000000); | |
286 | stopSprite.graphics.drawRect(0, 0, squareSize, squareSize); | |
287 | stopSprite.graphics.endFill(); | |
288 | stopSprite.x=5; | |
289 | stopSprite.y=6; | |
290 | ||
291 | recSprite.graphics.beginFill(0xff0000, 1); | |
292 | ||
293 | recSprite.graphics.drawCircle(0, 0, 4); | |
294 | recSprite.x=10; | |
295 | recSprite.y=10; | |
296 | ||
297 | //recordButton.addChild(recSprite); | |
298 | recCanvas.rawChildren.addChild(recSprite); | |
299 | recCanvas.rawChildren.addChild(stopRecSprite); | |
300 | playCanvas.rawChildren.addChild(playSprite); | |
301 | playCanvas.rawChildren.addChild(stopSprite); | |
302 | submitCanvas.rawChildren.addChild(submitSprite); | |
303 | stopRecSprite.visible = false; | |
304 | stopSprite.visible = false | |
305 | //recordButton.setStyle("icon",recIcon); | |
306 | //playButton.setStyle("icon", playIcon); | |
307 | //sumbmitButton.setStyle("icon", checkmarkIcon); | |
308 | } | |
309 | private function onSubmitClick():void | |
310 | { | |
311 | navigateToURL(new URLRequest("http://talknicer.com/vadim.cgi?filename="+fileName),"_self"); | |
312 | } | |
313 | private function onVideoStop(evt:Event):void | |
314 | { | |
315 | //playButton.styleName = PLAY_STYLE; | |
316 | playButton.label = PLAY_LABEL; | |
317 | playSprite.visible = true; | |
318 | stopSprite.visible = false; | |
319 | //playButton.setStyle("icon", playIcon); | |
320 | } | |
321 | private function micSlider_changeHandler(event:SliderEvent):void | |
322 | { | |
323 | if (getMic) | |
324 | _microphone.gain = 100-event.value; | |
325 | } | |
326 | ||
327 | private function showMicLevel(event:Event):void | |
328 | { | |
329 | if (getMic) | |
330 | { | |
331 | micLeval.setProgress(100-getMic.activityLevel, 100); | |
332 | } | |
333 | } | |
334 | ||
335 | private function startPlayback():void { | |
336 | ||
337 | switch ( getStatus() ){ | |
338 | ||
339 | case PLAYBACK_STAT: | |
340 | stopPlayback(); | |
341 | //playButton.styleName = PLAY_STYLE; | |
342 | playButton.label = PLAY_LABEL; | |
343 | playSprite.visible = true; | |
344 | stopSprite.visible = false; | |
345 | //playButton.setStyle("icon",playIcon); | |
346 | break; | |
347 | case RECORDING_STAT: | |
348 | stopRecord(); | |
349 | break; | |
350 | case INACTIVE_STAT: | |
351 | startPlaybackClass(); | |
352 | //playButton.styleName = STOP_STYLE; | |
353 | playButton.label = STOP_LABEL; | |
354 | playSprite.visible = false; | |
355 | stopSprite.visible = true; | |
356 | //playButton.setStyle("icon",stopIcon); | |
357 | break; | |
358 | ||
359 | } | |
360 | ||
361 | } | |
362 | ||
363 | private function startRecord():void { | |
364 | ||
365 | switch ( getStatus() ){ | |
366 | ||
367 | case RECORDING_STAT: | |
368 | stopRecord(); | |
369 | recordButton.label = RECORD_LABEL; | |
370 | //recordButton.setStyle("icon",recIcon); | |
371 | stopRecSprite.visible = false; | |
372 | recSprite.visible = true; | |
373 | //recordButton.styleName = RECORD_STYLE; | |
374 | playButton.enabled = true; | |
375 | sumbmitButton.enabled = true; | |
376 | ||
377 | return; | |
378 | ||
379 | case PLAYBACK_STAT: | |
380 | stopPlayback(); | |
381 | return; | |
382 | ||
383 | case INACTIVE_STAT: | |
384 | startRecordClass(); | |
385 | recordButton.label = STOP_LABEL; | |
386 | recSprite.visible = false; | |
387 | stopRecSprite.visible = true; | |
388 | //recordButton.setStyle("icon", stopIcon); | |
389 | //recordButton.styleName = STOP_STYLE; | |
390 | ||
391 | return; | |
392 | } | |
393 | ||
394 | } | |
395 | ||
396 | ||
397 | ]]> | |
398 | </mx:Script> | |
399 | <mx:Button enabled="false" left="0" right="0" bottom="0" top="0"/> | |
400 | <mx:Canvas left="0" right="0" bottom="0" mouseChildren="false" top="0" /> | |
401 | <mx:Text id="titleText" text="Audio Recorder" width="317" height="50" textAlign="center" color="#0000FF" fontSize="24" fontWeight="bold" horizontalCenter="0" top="20"/> | |
402 | <mx:VSlider height="60" x="27" y="90" maximum="100" minimum="0" value="50" id="micSlider" change="micSlider_changeHandler(event)" allowTrackClick="true" liveDragging="true" enabled="true" width="28"/> | |
403 | <mx:Canvas x="78" y="38" width="88" height="94"> | |
404 | ||
405 | <mx:ProgressBar mode="manual" label=" " height="9" id="micLeval" rotation="90" width="50" x="0" y="56" paddingLeft="0"/> | |
406 | </mx:Canvas> | |
407 | <mx:Form x="71" y="88"> | |
408 | ||
409 | <mx:HBox x="50" horizontalGap="0"> | |
410 | <mx:Canvas id="recCanvas"> | |
411 | ||
412 | ||
413 | <mx:Button id="recordButton" click="startRecord()" width="75" | |
414 | borderColor="#F71F09" | |
415 | color="#009900" | |
416 | label="{RECORD_LABEL}" | |
417 | ||
418 | /> | |
419 | </mx:Canvas> | |
420 | <mx:Canvas id="playCanvas"> | |
421 | ||
422 | ||
423 | <mx:Button enabled="false" id="playButton" click="startPlayback()" width="75" | |
424 | borderColor="#F71F09" | |
425 | color="#009900" | |
426 | label="{PLAY_LABEL}" /> | |
427 | </mx:Canvas> | |
428 | <mx:Canvas id="submitCanvas"> | |
429 | ||
430 | ||
431 | ||
432 | ||
433 | <mx:Button label="Submit" id="sumbmitButton" click="onSubmitClick()" | |
434 | enabled="false" fontWeight="normal" | |
435 | /> | |
436 | </mx:Canvas> | |
437 | ||
438 | </mx:HBox> | |
439 | ||
440 | </mx:Form> | |
441 | ||
442 | ||
443 | </mx:Application> |