| 1 | /** |
|---|
| 2 | * Abstract controller class of the MCV pattern, extended by all controlllers. |
|---|
| 3 | * |
|---|
| 4 | * @author Jeroen Wijering |
|---|
| 5 | * @version 1.8 |
|---|
| 6 | **/ |
|---|
| 7 | |
|---|
| 8 | |
|---|
| 9 | import com.jeroenwijering.players.*; |
|---|
| 10 | import com.jeroenwijering.utils.*; |
|---|
| 11 | |
|---|
| 12 | |
|---|
| 13 | class com.jeroenwijering.players.AbstractController |
|---|
| 14 | implements com.jeroenwijering.feeds.FeedListener { |
|---|
| 15 | |
|---|
| 16 | |
|---|
| 17 | /** Randomizer instance **/ |
|---|
| 18 | private var randomizer:Randomizer; |
|---|
| 19 | /** array with all registered models **/ |
|---|
| 20 | private var registeredModels:Array; |
|---|
| 21 | /** reference to the config array **/ |
|---|
| 22 | private var config:Object; |
|---|
| 23 | /** reference to the feed array **/ |
|---|
| 24 | private var feeder:Object; |
|---|
| 25 | /** Current item **/ |
|---|
| 26 | private var currentItem:Number; |
|---|
| 27 | /** Current item **/ |
|---|
| 28 | private var currentURL:String; |
|---|
| 29 | /** Current item **/ |
|---|
| 30 | private var isPlaying:Boolean; |
|---|
| 31 | /** Number of items played: used for repeat=list **/ |
|---|
| 32 | private var itemsPlayed:Number; |
|---|
| 33 | /** Array that saves the original video dimensions. **/ |
|---|
| 34 | private var sizes:Array; |
|---|
| 35 | |
|---|
| 36 | |
|---|
| 37 | /** Constructor. **/ |
|---|
| 38 | function AbstractController(cfg:Object,fed:Object) { |
|---|
| 39 | config = cfg; |
|---|
| 40 | feeder = fed; |
|---|
| 41 | feeder.addListener(this); |
|---|
| 42 | }; |
|---|
| 43 | |
|---|
| 44 | |
|---|
| 45 | /** Complete the build of the MCV cycle and start flow of events. **/ |
|---|
| 46 | public function startMCV(mar:Array) {}; |
|---|
| 47 | |
|---|
| 48 | |
|---|
| 49 | /** Receive events from the views. **/ |
|---|
| 50 | public function getEvent(typ:String,prm:Number,pr2:Number) { |
|---|
| 51 | //trace("controller: "+typ+": "+prm); |
|---|
| 52 | switch(typ) { |
|---|
| 53 | case "playpause": |
|---|
| 54 | setPlaypause(); |
|---|
| 55 | break; |
|---|
| 56 | case "prev": |
|---|
| 57 | if(noCommercial()) { setPrev(); } |
|---|
| 58 | break; |
|---|
| 59 | case "next": |
|---|
| 60 | if(noCommercial()) { setNext(); } |
|---|
| 61 | break; |
|---|
| 62 | case "stop": |
|---|
| 63 | if(noCommercial()) { setStop(); } |
|---|
| 64 | break; |
|---|
| 65 | case "scrub": |
|---|
| 66 | if(noCommercial()) { setScrub(prm); } |
|---|
| 67 | break; |
|---|
| 68 | case "volume": |
|---|
| 69 | setVolume(prm); |
|---|
| 70 | break; |
|---|
| 71 | case "playitem": |
|---|
| 72 | if(noCommercial()) { setPlayitem(prm); } |
|---|
| 73 | break; |
|---|
| 74 | case "getlink": |
|---|
| 75 | setGetlink(prm); |
|---|
| 76 | break; |
|---|
| 77 | case "fullscreen": |
|---|
| 78 | setFullscreen(); |
|---|
| 79 | break; |
|---|
| 80 | case "complete": |
|---|
| 81 | setComplete(); |
|---|
| 82 | break; |
|---|
| 83 | case "captions": |
|---|
| 84 | setCaptions(); |
|---|
| 85 | break; |
|---|
| 86 | case "audio": |
|---|
| 87 | setAudio(); |
|---|
| 88 | break; |
|---|
| 89 | case "size": |
|---|
| 90 | saveSizes(prm,pr2); |
|---|
| 91 | break; |
|---|
| 92 | default: |
|---|
| 93 | trace("controller: incompatible event received"); |
|---|
| 94 | break; |
|---|
| 95 | } |
|---|
| 96 | }; |
|---|
| 97 | |
|---|
| 98 | |
|---|
| 99 | /** Check for commercial **/ |
|---|
| 100 | private function noCommercial():Boolean { |
|---|
| 101 | if(feeder.feed[currentItem]['category'] == 'commercial' || |
|---|
| 102 | feeder.feed[currentItem]['category'] == 'preroll' || |
|---|
| 103 | feeder.feed[currentItem]['category'] == 'postroll') { |
|---|
| 104 | return false; |
|---|
| 105 | } else { |
|---|
| 106 | return true; |
|---|
| 107 | } |
|---|
| 108 | }; |
|---|
| 109 | |
|---|
| 110 | |
|---|
| 111 | /** PlayPause switch **/ |
|---|
| 112 | private function setPlaypause() {}; |
|---|
| 113 | |
|---|
| 114 | |
|---|
| 115 | /** Play previous item. **/ |
|---|
| 116 | private function setPrev() {}; |
|---|
| 117 | |
|---|
| 118 | |
|---|
| 119 | /** Play next item. **/ |
|---|
| 120 | private function setNext() {}; |
|---|
| 121 | |
|---|
| 122 | |
|---|
| 123 | /** Stop and clear item. **/ |
|---|
| 124 | private function setStop() {}; |
|---|
| 125 | |
|---|
| 126 | |
|---|
| 127 | /** Forward scrub number to model. **/ |
|---|
| 128 | private function setScrub(prm:Number) {}; |
|---|
| 129 | |
|---|
| 130 | |
|---|
| 131 | /** Play a new item. **/ |
|---|
| 132 | private function setPlayitem(itm:Number) { |
|---|
| 133 | currentURL = feeder.feed[itm]['file']; |
|---|
| 134 | }; |
|---|
| 135 | |
|---|
| 136 | |
|---|
| 137 | /** Get url from an item if link exists, else playpause. **/ |
|---|
| 138 | private function setGetlink(idx:Number) {}; |
|---|
| 139 | |
|---|
| 140 | |
|---|
| 141 | /** Determine what to do if an item is completed. **/ |
|---|
| 142 | private function setComplete() {}; |
|---|
| 143 | |
|---|
| 144 | |
|---|
| 145 | /** Volume event handler **/ |
|---|
| 146 | private function setVolume(prm:Number) {}; |
|---|
| 147 | |
|---|
| 148 | |
|---|
| 149 | /** Switch fullscreen mode **/ |
|---|
| 150 | private function setFullscreen() {}; |
|---|
| 151 | |
|---|
| 152 | |
|---|
| 153 | /** Switch captions on and off **/ |
|---|
| 154 | private function setCaptions() {}; |
|---|
| 155 | |
|---|
| 156 | |
|---|
| 157 | /** Switch captions on and off **/ |
|---|
| 158 | private function saveSizes(pr1:Number,pr2:Number) { |
|---|
| 159 | sizes = new Array(pr1,pr2); |
|---|
| 160 | }; |
|---|
| 161 | |
|---|
| 162 | |
|---|
| 163 | /** Switch audiotrack on and off **/ |
|---|
| 164 | private function setAudio() {}; |
|---|
| 165 | |
|---|
| 166 | |
|---|
| 167 | /** Sending changes to all registered models. **/ |
|---|
| 168 | private function sendChange(typ:String,prm:Number):Void { |
|---|
| 169 | for(var i=0; i<registeredModels.length; i++) { |
|---|
| 170 | registeredModels[i].getChange(typ,prm); |
|---|
| 171 | } |
|---|
| 172 | }; |
|---|
| 173 | |
|---|
| 174 | |
|---|
| 175 | /** check with feedupdates if current item is also changed **/ |
|---|
| 176 | public function onFeedUpdate(typ:String) { |
|---|
| 177 | if(typ == 'new') { |
|---|
| 178 | setStop(); |
|---|
| 179 | startMCV(); |
|---|
| 180 | } else if (typ == 'add') { |
|---|
| 181 | if (feeder.feed[currentItem+1]['file'] == currentURL) { |
|---|
| 182 | currentItem++; |
|---|
| 183 | sendChange("item",currentItem); |
|---|
| 184 | } |
|---|
| 185 | if(randomizer != undefined) { |
|---|
| 186 | randomizer = new Randomizer(feeder.feed); |
|---|
| 187 | } |
|---|
| 188 | } else if(typ == 'remove') { |
|---|
| 189 | if (feeder.feed[currentItem-1]['file'] == currentURL) { |
|---|
| 190 | currentItem--; |
|---|
| 191 | sendChange("item",currentItem); |
|---|
| 192 | if(randomizer != undefined) { |
|---|
| 193 | randomizer = new Randomizer(feeder.feed); |
|---|
| 194 | } |
|---|
| 195 | } else if(feeder.feed[currentItem]['file'] != currentURL) { |
|---|
| 196 | setStop(); |
|---|
| 197 | startMCV(); |
|---|
| 198 | } else { |
|---|
| 199 | if(randomizer != undefined) { |
|---|
| 200 | randomizer = new Randomizer(feeder.feed); |
|---|
| 201 | } |
|---|
| 202 | } |
|---|
| 203 | } |
|---|
| 204 | }; |
|---|
| 205 | |
|---|
| 206 | |
|---|
| 207 | } |
|---|