]> git.vomp.tv Git - vompclient.git/blob - vaudioselector.cc
Update for windows
[vompclient.git] / vaudioselector.cc
1 /*\r
2     Copyright 2006 Chris Tallon, Marten Richter\r
3 \r
4     This file is part of VOMP.\r
5 \r
6     VOMP is free software; you can redistribute it and/or modify\r
7     it under the terms of the GNU General Public License as published by\r
8     the Free Software Foundation; either version 2 of the License, or\r
9     (at your option) any later version.\r
10 \r
11     VOMP is distributed in the hope that it will be useful,\r
12     but WITHOUT ANY WARRANTY; without even the implied warranty of\r
13     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r
14     GNU General Public License for more details.\r
15 \r
16     You should have received a copy of the GNU General Public License\r
17     along with VOMP; if not, write to the Free Software\r
18     Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\r
19 */\r
20 \r
21 #include "vaudioselector.h"\r
22 \r
23 VAudioSelector::VAudioSelector(void* tparent, bool* availableAudioChannels, int currentAudioChannel, RecInfo* recInfo)\r
24 {\r
25   Log::getInstance()->log("VAS", Log::DEBUG, "%i", currentAudioChannel);\r
26 \r
27   parent = tparent;\r
28 \r
29   create(200, 120);\r
30 \r
31 //  setTitleText(tr("Audio"));\r
32 //  setTitleBarOn(1);\r
33 //  setTitleBarColour(Colour::TITLEBARBACKGROUND);\r
34 \r
35   sl.setSurface(surface);\r
36   sl.setSurfaceOffset(40, 30);\r
37   sl.setDimensions(area.w - 45, area.h - 30);\r
38 \r
39   // Load data from availableAudioChannels, currentAudioChannel and recInfo\r
40 \r
41   int i;\r
42 \r
43   for (i = 0; i < PES_AUDIO_MAXCHANNELS; i++)\r
44   {\r
45     if (availableAudioChannels[i])\r
46     {\r
47       AudioChannel* ac = new AudioChannel();\r
48       ac->type = 0;\r
49       ac->name = NULL;\r
50       ac->pestype = PES_AUDIO_START + i;\r
51       acl.push_back(ac);\r
52     }\r
53   }\r
54 \r
55   unsigned char numchan_recinfo = recInfo->numComponents;\r
56   unsigned char numchan_siz = acl.size();\r
57   int mp_audcounter = 0;\r
58   int ac3_counter = 0;\r
59   int ac3_offset = 0;\r
60 \r
61   for (i = 0; i < numchan_siz; i++)\r
62   {\r
63     AudioChannel* ac = acl[i];\r
64     if (ac)\r
65     {\r
66       if (ac->type==0)\r
67       {\r
68         ac3_offset++;\r
69       }\r
70     }\r
71   }\r
72 \r
73   unsigned char type;\r
74   char* lang;\r
75   char* description;\r
76   int type_int;\r
77 \r
78   for (i = 0; i < numchan_recinfo; i++)\r
79   {\r
80     if (recInfo->streams[i] != 2) continue; //not an audio component\r
81     type = recInfo->types[i];\r
82     lang = recInfo->languages[i];\r
83     description = recInfo->descriptions[i];\r
84     AudioChannel* ac = NULL;\r
85     type_int = 0;\r
86 \r
87     switch (type)\r
88     {\r
89       case 1: //mpaudio mono\r
90       case 3: //mpaudio stereo\r
91         if (mp_audcounter < numchan_siz) ac = acl[mp_audcounter];\r
92         type_int = 0;\r
93         break;\r
94       case 5: //ac3\r
95         if (ac3_counter + ac3_offset < numchan_siz) ac = acl[ac3_counter + ac3_offset];\r
96         type_int = 1;\r
97         break;\r
98     }\r
99 \r
100     if (ac)\r
101     {\r
102       if (ac->type == type_int)\r
103       {\r
104         if (description && (strlen(description) > 0))\r
105         {\r
106           ac->name = new char[strlen(description)+1];\r
107           strcpy(ac->name, description);\r
108         }\r
109         else if (lang && (strlen(lang) > 0))\r
110         {\r
111           ac->name = new char[strlen(lang)+1];\r
112           strcpy(ac->name, lang);\r
113         }\r
114       }\r
115     }\r
116 \r
117     switch (type_int)\r
118     {\r
119       case 0: //mpaudio\r
120         mp_audcounter++;\r
121         break;\r
122       case 1: //ac3\r
123         ac3_counter++;\r
124         break;\r
125     }\r
126   }\r
127 \r
128   // Now do display\r
129 \r
130   char tempString[300];\r
131   int audioChannelListSize = acl.size();\r
132 \r
133   if (audioChannelListSize)\r
134   {\r
135     for(i = 0; i < audioChannelListSize; i++)\r
136     {\r
137       AudioChannel* ac = acl[i];\r
138 \r
139       if (ac->name)\r
140       {\r
141         sl.addOption(ac->name, (ULONG)ac, (ac->pestype == currentAudioChannel));\r
142       }\r
143       else\r
144       {\r
145         SNPRINTF(tempString, 299, "%lu", (ULONG)(ac->pestype - PES_AUDIO_START));\r
146         sl.addOption(tempString, (ULONG)ac, (ac->pestype == currentAudioChannel));\r
147       }\r
148     }\r
149   }\r
150   else\r
151   {\r
152     sl.addOption(tr("No audio channel data available"), 0, 1);\r
153   }\r
154 }\r
155 \r
156 VAudioSelector::~VAudioSelector()\r
157 {\r
158   int audioChannelListSize = acl.size();\r
159   for(int i = 0; i < audioChannelListSize; i++)\r
160   {\r
161     delete acl[i];\r
162   }\r
163   acl.clear();\r
164 \r
165   sl.clear();\r
166 \r
167   Message* m = new Message();\r
168   m->from = this;\r
169   m->to = parent;\r
170   m->message = Message::CHILD_CLOSE;\r
171   Command::getInstance()->postMessageNoLock(m);\r
172 }\r
173 \r
174 void VAudioSelector::draw()\r
175 {\r
176   View::draw();\r
177   rectangle(0, 0, area.w, 30, Colour::TITLEBARBACKGROUND);\r
178   drawText(tr("Audio"), 45, 5, Colour::LIGHTTEXT);\r
179 \r
180   sl.setBackgroundColour(backgroundColour);\r
181   sl.draw();\r
182 }\r
183 \r
184 int VAudioSelector::handleCommand(int command)\r
185 {\r
186   switch (command)\r
187   {\r
188     case Remote::BACK:\r
189     case Remote::OK:\r
190     case Remote::GREEN:\r
191     {\r
192       return 4;\r
193     }\r
194     case Remote::DF_UP:\r
195     case Remote::UP:\r
196     {\r
197       sl.up();\r
198       sl.draw();\r
199 \r
200       ViewMan::getInstance()->updateView(this);\r
201 \r
202       Message* m = new Message();\r
203       m->from = this;\r
204       m->to = parent;\r
205       m->message = Message::AUDIO_CHANGE_CHANNEL;\r
206       m->parameter = ((AudioChannel*)sl.getCurrentOptionData())->pestype;\r
207       Command::getInstance()->postMessageNoLock(m);\r
208 \r
209       return 2;\r
210     }\r
211     case Remote::DF_DOWN:\r
212     case Remote::DOWN:\r
213     {\r
214       sl.down();\r
215       sl.draw();\r
216 \r
217       ViewMan::getInstance()->updateView(this);\r
218 \r
219       Message* m = new Message();\r
220       m->from = this;\r
221       m->to = parent;\r
222       m->message = Message::AUDIO_CHANGE_CHANNEL;\r
223       m->parameter = ((AudioChannel*)sl.getCurrentOptionData())->pestype;\r
224       Command::getInstance()->postMessageNoLock(m);\r
225 \r
226       return 2;\r
227     }\r
228   }\r
229 \r
230   return 0;\r
231 }\r