
Velichko Anton
 
Профиль
Группа: Участник
Сообщений: 851
Регистрация: 28.4.2005
Где: Санкт-Петербург
Репутация: 9 Всего: 18
|
выкладываю просто класс с комментами Код | package ascript.components { import flash.display.Bitmap; import flash.display.BitmapData; import flash.events.ContextMenuEvent; import flash.events.Event; import flash.events.MouseEvent; import flash.filters.BlurFilter; import flash.geom.Point; import flash.geom.Rectangle; import flash.media.SoundMixer; import flash.utils.ByteArray; import mx.core.UIComponent; [Style(name="LineColor", type="Number", format="Color", inherit="no")] [Style(name="FillColor", type="Number", format="Color", inherit="no")] public class Visualization extends UIComponent { public static var AEVENT:String = "aVis"; public static var STYLE_LINE:uint = 10; public static var STYLE_WAVE:uint = 20; public static var STYLE_BARS:uint = 30; public static var CHANEL_MONO:uint = 10; public static var CHANEL_STEREO:uint = 20; public static var CHANEL_RIGHT:uint = 30; public static var CHANEL_LEFT:uint = 40; public static var EFFECT_VBLUR:uint = 10; public static var EFFECT_HBLUR:uint = 20; public static var EFFECT_VSCROLL:uint = 30; public static var EFFECT_HSCROLL:uint = 40; public var beforEffects:uint = Visualization.EFFECT_VBLUR; public var afterEffects:uint = Visualization.EFFECT_HBLUR; public var type:uint = Visualization.STYLE_WAVE; public var channel:uint = Visualization.CHANEL_STEREO; public var bars:uint = 256; private var audioLineColor:uint = 0xFFFFFF; private var audioFillColor:uint = 0xFFEEFF;
private var gain:uint = 1; private var display:UIComponent = new UIComponent(); public var bitmapData:BitmapData = new BitmapData(1, 1, true, 0x00000000); public var bitmap:Bitmap = new Bitmap(bitmapData); public var peak:Number = 0; private var spectrumData:ByteArray = new ByteArray(); private var rc:Number = 0; private var rp:Number = 0; /** * Конструктор компонента */ public function Visualization() { // Вешаем событие на onEnterFrame addEventListener(Event.ENTER_FRAME, enterFrameListener); if(!hasEventListener(Visualization.AEVENT)) { switch(afterEffects) { case Visualization.EFFECT_HBLUR: addEventListener(Visualization.AEVENT, this.horizontalBlur); break; case Visualization.EFFECT_VBLUR: addEventListener(Visualization.AEVENT, this.verticalBlur); break; case Visualization.EFFECT_HSCROLL: addEventListener(Visualization.AEVENT, this.horizontalScroll); break; case Visualization.EFFECT_VSCROLL: addEventListener(Visualization.AEVENT, this.verticalScroll); break; } } addEventListener(MouseEvent.MOUSE_DOWN, this.changeStyle); } /** * Добавляем битмапу на компонент * переопределяет метод createChildren() * у UIComponent */ override protected function createChildren():void { addChild(bitmap); } /** * Проверяем на изменения размера и пересоздаём * битмапу. */ override protected function updateDisplayList(width:Number, heigth:Number):void { super.updateDisplayList(width, heigth); // забираем толщину границы var borderTrick:uint = getStyle("borderThickness") * 2; if(width - borderTrick > 0 && heigth - borderTrick > 1) { bitmapData = new BitmapData(width - borderTrick, heigth - borderTrick, true, 0x0); } bitmap.bitmapData = bitmapData; // Берем цвета audioLineColor = getStyle("LineColor"); audioFillColor = getStyle("FillColor"); // Выставляем переменные reorder center и reorder pixel rc = (heigth - borderTrick) / 2; rp = (width - borderTrick) / 256; } /** * Обработчик события onEnterFrame у нашего компонента */ private function enterFrameListener(e:Event):void { // забрали ректангл var rect:Rectangle = bitmapData.rect; // Сделали снапшет нашего звука SoundMixer.computeSpectrum(spectrumData, (type == Visualization.STYLE_BARS), 0); bitmapData.fillRect(rect, 0x0); switch (channel) { case Visualization.CHANEL_MONO: toMono(); case Visualization.CHANEL_LEFT: if(type == Visualization.STYLE_LINE || type == Visualization.STYLE_WAVE) { drawWave(1); } if(type == Visualization.STYLE_WAVE) { spectrumData.position=0; drawWave(-1); } if(type == Visualization.STYLE_BARS) { drawEQ(); } break; case Visualization.CHANEL_RIGHT: for (var i:uint = 0; i < 256 ; i++) { spectrumData.readFloat(); } // используем spectrumData.position if(type == Visualization.STYLE_LINE || type == Visualization.STYLE_WAVE) { drawWave(1); } if(type == Visualization.STYLE_WAVE) { spectrumData.position = 0; for(i = 0; i < 256 ; i++) { spectrumData.readFloat(); } drawWave(-1); } if(type == Visualization.STYLE_BARS) { drawEQ(); } break; case Visualization.CHANEL_STEREO: if(type == Visualization.STYLE_LINE || type == Visualization.STYLE_WAVE) { drawWave(1); drawWave(1); } if(type == Visualization.STYLE_WAVE) { spectrumData.position = 0; drawWave(-1); drawWave(-1); } if(type == Visualization.STYLE_BARS) { drawEQ(); drawEQ(); } break; default: } // Блёрим для красоты ) bitmapData.applyFilter( bitmapData, rect, new Point(0, 0), new BlurFilter(bitmapData.width / 256, bitmapData.width / 256, 1)); dispatchEvent( new Event(Visualization.AEVENT, true) ); } /** * Используется только для моно выхода */ private function toMono():void { spectrumData.position = 0; if(spectrumData.length == 2048) { var leftData:ByteArray = new ByteArray(); var rightData:ByteArray = new ByteArray(); spectrumData.readBytes(leftData, 0, 1024); spectrumData.readBytes(rightData, 0, 1024); spectrumData = new ByteArray(); for (var i:uint = 0; i < 256 ; i++) { // Усредняем по 2-м каналам - получаем моно ) spectrumData.writeFloat((leftData.readFloat() + rightData.readFloat()) / 2); } spectrumData.position = 0; } } /** * Используется когда стиль отображения * Visualization.STYLE_LINE || Visualization.STYLE_WAVE */ private function drawWave(modifier:Number=1):void { var v:Number; var lastv:Number = rc; peak = 0; for (var i:uint = 0; i < 256; i++) { var rf:Number = spectrumData.readFloat(); v = rc - rf * rc * modifier; if(type == Visualization.STYLE_WAVE){ bitmapData.fillRect( new Rectangle( i * rp, Math.min(v, rc), rp, Math.abs(rc - v)), 0xFF000000 | audioFillColor ); } bitmapData.fillRect( new Rectangle( i * rp, v, rp, 1 + Math.abs(lastv - v)), 0xFF000000 | audioLineColor); lastv = v; if(Math.abs(rf) > peak) { peak = Math.abs(rf); } //horizontalScroll(null); } } private function drawEQ():void { var v:Number; var n:Number = 0; var nrp:Number = rp * 256 / bars; for (var i:uint = 0; i < bars; i++) { n = 0; for (var j:uint = 0; j < Math.floor(256 / bars); j++) { n += spectrumData.readFloat(); if(Math.abs(n)>peak) { peak = Math.abs(n); } } n = n / Math.floor(256 / bars) v = Math.max(rc * 2 - n * rc * 2 * gain, 5); bitmapData.fillRect( new Rectangle( nrp / 8 + i * nrp, v, nrp / 2 + nrp / 4, rc * 2 - v), 0xFF000000 | audioFillColor); bitmapData.fillRect( new Rectangle( nrp / 8 + i * nrp, v, nrp / 2 + nrp / 4, 1), 0xFF000000 | audioLineColor ); } } private function verticalBlur(e:Event):void { bitmapData.applyFilter( bitmapData, bitmapData.rect, new Point(0,0), new BlurFilter(0,3)); } private function horizontalBlur(e:Event):void { bitmapData.applyFilter( bitmapData, bitmapData.rect, new Point(0,0), new BlurFilter(3,0)); } private function verticalScroll(e:Event):void { bitmapData.scroll(0,1); } private function horizontalScroll(e:Event):void { bitmapData.scroll(1,0); } private function changeStyle(e:Event):void { type = (type + 10) == 40 ? 10 : type + 10; } } }
|
--------------------
ГЫ...
|