KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > org > mmbase > applications > media > filters > RealSorter


1  /*
2  
3 This software is OSI Certified Open Source Software.
4 OSI Certified is a certification mark of the Open Source Initiative.
5  
6 The license (Mozilla version 1.0) can be read at the MMBase site.
7 See http://www.MMBase.org/license
8  
9  */

10
11 package org.mmbase.applications.media.filters;
12
13 import org.mmbase.applications.media.urlcomposers.URLComposer;
14 import org.mmbase.applications.media.Format;
15 import org.mmbase.util.logging.*;
16 import org.mmbase.util.xml.DocumentReader;
17 import org.w3c.dom.Element JavaDoc;
18 import java.util.*;
19
20
21 /**
22  * This can sort according to properties of real streams. The client
23  * can request a certain speed/channels, but it can be forced to be
24  * between two values (configured in mediasourcefilter.xml).
25  *
26  * This ia 'chainsorter' meaning that it is a combination of severa;
27  * other sorters, which are implemented as inner classes. This is
28  * because several criteria are to be distinguished, and taking them
29  * apart makes things nice and simple.
30  *
31  * @author Michiel Meeuwissen
32  * @author Rob Vermeulen
33  * @version $Id: RealSorter.java,v 1.10 2005/07/09 15:29:11 nklasens Exp $
34  */

35 public class RealSorter extends ChainSorter {
36     private static Logger log = Logging.getLoggerInstance(RealSorter.class);
37
38     // XML subtag
39
public static final String JavaDoc CONFIG_TAG = "config.realAudio";
40
41     /**
42      * Prefer real a little if this filter is used.
43      * Other possibility: Impelmeent it that if one of both URLComposer are no reals, that they are equal then.
44      */

45
46     protected class RealFormatSorter extends PreferenceSorter {
47         protected int getPreference(URLComposer ri) {
48             if (ri.getFormat() != Format.RM) return 0;
49             return 1;
50         }
51     }
52
53     /**
54      * Sort with speed
55      */

56     protected class SpeedSorter extends PreferenceSorter {
57
58         private int minSpeed = -1;
59         private int maxSpeed = -1;
60         private int defaultSpeed = -1;
61
62         public void configure(DocumentReader reader, Element JavaDoc e) {
63             try {
64                 minSpeed = Integer.parseInt(reader.getElementValue(reader.getElementByPath(e, CONFIG_TAG + ".minspeed")));
65                 maxSpeed = Integer.parseInt(reader.getElementValue(reader.getElementByPath(e, CONFIG_TAG + ".maxspeed")));
66                 defaultSpeed = Integer.parseInt(reader.getElementValue(reader.getElementByPath(e, CONFIG_TAG + ".defaultspeed")));
67             } catch (Exception JavaDoc ex) {
68                 log.error("Check mediasourcefilter.xml, something went wrong while reading realaudio information:" + ex);
69                 log.error(Logging.stackTrace(ex));
70             }
71             if(log.isDebugEnabled()) {
72                 log.debug("Minspeed=" + minSpeed);
73                 log.debug("Maxspeed=" + maxSpeed);
74                 log.debug("Defaultspeed=" + defaultSpeed);
75            }
76         }
77         /**
78          * @todo
79          */

80         protected int getPreference(URLComposer ri) {
81             Map info = ri.getInfo();
82             int wantedSpeed = -1;
83
84             int preference = 0;
85             if(info.containsKey("wantedSpeed")) {
86                 preference = 1; // explicitely requested something real-specific, prefer real
87
wantedSpeed = ((Integer JavaDoc) info.get("wantedSpeed")).intValue();
88             } else {
89         wantedSpeed = defaultSpeed;
90         }
91
92             if (log.isDebugEnabled()) {
93                 log.debug("wantedSpeed:" + wantedSpeed + " minspeed: " + minSpeed + " maxspeed: " + maxSpeed);
94             }
95
96             if( wantedSpeed < minSpeed) {
97                 wantedSpeed = minSpeed;
98             } else if( wantedSpeed > maxSpeed) {
99                 wantedSpeed = maxSpeed;
100             }
101
102             int speed = ri.getSource().getIntValue("bitrate");
103
104             if (speed <= wantedSpeed) {
105                 preference -= Math.abs(wantedSpeed - speed);
106             } else {
107                 preference -= Math.abs(wantedSpeed - speed)*5; //Still sort them, but give them a lower priority
108
}
109             return preference;
110         }
111     }
112
113     /**
114      * Sort with channels
115      */

116
117     protected class ChannelsSorter extends PreferenceSorter {
118         private int minChannels = -1;
119         private int maxChannels = -1;
120         private int defaultChannels = -1;
121
122
123         public void configure(DocumentReader reader, Element JavaDoc e) {
124             try {
125                 minChannels = Integer.parseInt(reader.getElementValue(reader.getElementByPath(e, CONFIG_TAG + ".minchannels")));
126                 maxChannels = Integer.parseInt(reader.getElementValue(reader.getElementByPath(e, CONFIG_TAG + ".maxchannels")));
127                 defaultChannels = Integer.parseInt(reader.getElementValue(reader.getElementByPath(e, CONFIG_TAG + ".defaultchannels")));
128             } catch (Exception JavaDoc ex) {
129                 log.error("Check mediasourcefilter.xml, something went wrong while reading realaudio information:" + ex);
130                 log.error(Logging.stackTrace(ex));
131             }
132             if(log.isDebugEnabled()) {
133                 log.debug("Minchannels=" + minChannels);
134                 log.debug("Maxchannels=" + maxChannels);
135                 log.debug("Defaultchannels=" + defaultChannels);
136             }
137         }
138
139         /**
140          * @javadoc
141          */

142         protected int getPreference(URLComposer ri) {
143             Map info = ri.getInfo();
144             int wantedChannels = -1;
145
146             int preference = 0;
147             if(info.containsKey("wantedChannels")) {
148                 preference = 1; // explicitely requested something real-specific, prefer real
149
wantedChannels = ((Integer JavaDoc) info.get("wantedChannels")).intValue();
150             } else {
151             wantedChannels = defaultChannels;
152         }
153
154             if (log.isDebugEnabled()) {
155                 log.debug("wantedChannels:" + wantedChannels + " minchennels: " + minChannels + " maxchannels: " + maxChannels);
156             }
157
158             int channels = ri.getSource().getIntValue("channels");
159
160             if (channels <= wantedChannels) {
161                 preference -= Math.abs(wantedChannels - channels);
162          
163             }
164             return preference;
165         }
166     }
167
168     
169     public RealSorter() {
170         add(new RealFormatSorter()); // Prefer real?
171
add(new SpeedSorter());
172         add(new ChannelsSorter());
173     }
174
175
176 }
177
178
Popular Tags