source: trunk/as3/com/jeroenwijering/player/Model.as @ 138

Revision 138, 6.1 KB checked in by jeroen, 4 years ago (diff)

some small fixes for the new model selection logic

  • Property svn:executable set to *
Line 
1/**
2* Wraps all media APIs (all models) and manages thumbnail display.
3**/
4package com.jeroenwijering.player {
5
6
7import com.jeroenwijering.events.*;
8import com.jeroenwijering.models.BasicModel;
9import com.jeroenwijering.player.*;
10import com.jeroenwijering.utils.*;
11
12import flash.display.*;
13import flash.events.*;
14import flash.net.URLRequest;
15import flash.system.LoaderContext;
16
17
18public class Model extends EventDispatcher {
19
20
21        /** Object with all configuration variables. **/
22        public var config:Object;
23        /** Reference to the skin MovieClip. **/
24        public var skin:MovieClip;
25        /** Object with all display variables. **/
26        private var sploader:SPLoader;
27        /** Reference to the player's controller. **/
28        private var controller:Controller;
29        /** The list with all active models. **/
30        private var models:Object;
31        /** Loader for the preview image. **/
32        private var thumb:Loader;
33        /** Save the currently playing playlist item. **/
34        private var item:Object;
35        /** Save the current image url to prevent duplicate loading. **/
36        private var image:String;
37
38
39        /** Constructor, save references, setup listeners and  init thumbloader. **/
40        public function Model(cfg:Object,skn:MovieClip,ldr:SPLoader,ctr:Controller):void {
41                config = cfg;
42                skin = skn;
43                sploader = ldr;
44                controller = ctr;
45                controller.addEventListener(ControllerEvent.ITEM,itemHandler);
46                controller.addEventListener(ControllerEvent.MUTE,muteHandler);
47                controller.addEventListener(ControllerEvent.PLAY,playHandler);
48                controller.addEventListener(ControllerEvent.PLAYLIST,playlistHandler);
49                controller.addEventListener(ControllerEvent.RESIZE,resizeHandler);
50                controller.addEventListener(ControllerEvent.SEEK,seekHandler);
51                controller.addEventListener(ControllerEvent.STOP,stopHandler);
52                controller.addEventListener(ControllerEvent.VOLUME,volumeHandler);
53                thumb = new Loader();
54                thumb.contentLoaderInfo.addEventListener(Event.COMPLETE,thumbHandler);
55                Draw.clear(skin.display.media);
56                skin.display.addChildAt(thumb,skin.display.getChildIndex(skin.display.media)+1);
57                skin.display.media.visible = false;
58                models = new Object();
59        };
60
61
62        /** Item change: stop the old model and start the new one. **/
63        private function itemHandler(evt:ControllerEvent):void {
64                if(item) {
65                        models[item['type']].stop();
66                }
67                item = controller.playlist[config['item']];
68                if(models[item['type']]) {
69                        models[item['type']].load(item);
70                } else {
71                        sendEvent(ModelEvent.ERROR,{message:'No suiteable model found for playback of this file.'});
72                }
73                if(item['image'] && item['image'] != image) {
74                        image = item['image'];
75                        thumb.load(new URLRequest(item['image']),new LoaderContext(true));
76                }
77        };
78
79
80        /** Load a new playback model. **/
81        public function loadModel(mdl:BasicModel,typ:String):void {
82                models[typ] = mdl;
83        };
84
85
86        /**
87        * Place the mediafile fro the current model on stage.
88        *
89        * @param obj    The displayobject (MovieClip/Video/Loader) to display.
90        **/
91        public function mediaHandler(obj:DisplayObject=undefined):void {
92                Draw.clear(skin.display.media);
93                skin.display.media.addChild(obj);
94                resizeHandler();
95        };
96
97
98        /** Make the current model toggle its mute state. **/
99        private function muteHandler(evt:ControllerEvent):void {
100                if(item) {
101                        if(evt.data.state == true) {
102                                models[item['type']].volume(0);
103                        } else {
104                                models[item['type']].volume(config['volume']);
105                        }
106                }
107        };
108
109
110        /** Make the current model play or pause. **/
111        private function playHandler(evt:ControllerEvent):void {
112                if(item) {
113                        if(evt.data.state == true) {
114                                models[item['type']].play();
115                        } else {
116                                models[item['type']].pause();
117                        }
118                }
119        };
120
121
122        /** Load a new thumbnail. **/
123        private function playlistHandler(evt:ControllerEvent):void {
124                var img:String = controller.playlist[config['item']]['image'];
125                if(img && img != image) {
126                        image = img;
127                        thumb.load(new URLRequest(img),new LoaderContext(true));
128                }
129        };
130
131
132        /** Resize the media and thumb. **/
133        private function resizeHandler(evt:Event=null):void {
134                var cfg:Object = sploader.getPluginConfig(sploader.getPlugin('display'));
135                Stretcher.stretch(skin.display.media,cfg['width'],cfg['height'],config['stretching']);
136                if(thumb.width > 10) {
137                        Stretcher.stretch(thumb,cfg['width'],cfg['height'],config['stretching']);
138                }
139        };
140
141
142        /** Make the current model seek. **/
143        private function seekHandler(evt:ControllerEvent):void {
144                if(item) {
145                        models[item['type']].seek(evt.data.position);
146                }
147        };
148
149
150        /** Make the current model stop and show the thumb. **/
151        private function stopHandler(evt:ControllerEvent=undefined):void {
152                if(item) {
153                        models[item['type']].stop();
154                }
155        };
156
157
158        /** 
159        * Dispatch events to the View/ Controller.
160        * When switching states, the thumbnail is shown/hidden.
161        *
162        * @param typ    The eventtype to dispatch.
163        * @param dat    An object with data to send along.
164        * @see                  ModelEvent
165        **/
166        public function sendEvent(typ:String,dat:Object):void {
167                switch(typ) {
168                        case ModelEvent.STATE:
169                                dat['oldstate'] = config['state'];
170                                config['state'] = dat.newstate;
171                                dispatchEvent(new ModelEvent(typ,dat));
172                                switch(dat['newstate']) {
173                                        case ModelStates.IDLE:
174                                                sendEvent(ModelEvent.LOADED,{loaded:0,offset:0,total:0});
175                                        case ModelStates.COMPLETED:
176                                                thumb.visible = true;
177                                                skin.display.media.visible = false;
178                                                sendEvent(ModelEvent.TIME,{position:0,duration:item['duration']});
179                                                break;
180                                        case ModelStates.PLAYING:
181                                                if(item['file'].indexOf('m4a') == -1
182                                                        && item['file'].indexOf('mp3') == -1
183                                                        && item['file'].indexOf('aac') == -1) {
184                                                        thumb.visible = false;
185                                                        skin.display.media.visible = true;
186                                                } else {
187                                                        thumb.visible = true;
188                                                        skin.display.media.visible = false;
189                                                }
190                                                break;
191                                }
192                                break;
193                        case ModelEvent.META:
194                                if(dat.width) { resizeHandler(); }
195                        default:
196                                dispatchEvent(new ModelEvent(typ,dat));
197                                break;
198                }
199        };
200
201
202        /** Thumb loaded, try to antialias it before resizing. **/
203        private function thumbHandler(evt:Event) {
204                try {
205                        Bitmap(thumb.content).smoothing = true;
206                } catch (err:Error) {}
207                resizeHandler();
208        };
209
210
211        /** Make the current model change volume. **/
212        private function volumeHandler(evt:ControllerEvent):void {
213                if(item) {
214                        models[item['type']].volume(evt.data.percentage);
215                }
216        };
217
218
219}
220
221
222}
Note: See TracBrowser for help on using the repository browser.