]> git.vomp.tv Git - vompclient.git/blob - vaudioselector.cc
Audio channel selection code *unfinished*
[vompclient.git] / vaudioselector.cc
1 /*\r
2     Copyright 2004-2005 Chris Tallon\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(View* tparent, bool* availableAudioChannels, int currentAudioChannel, RecInfo* recInfo)\r
24 {\r
25   parent = tparent;\r
26 \r
27   create(200, 120);\r
28   if (Video::getInstance()->getFormat() == Video::PAL)\r
29   {\r
30     setScreenPos(62, 410);\r
31   }\r
32   else\r
33   {\r
34     setScreenPos(57, 320);\r
35   }\r
36 \r
37 \r
38   setTitleText(tr("Audio"));\r
39   setBackgroundColour(Colour::VIEWBACKGROUND);\r
40   setTitleBarOn(1);\r
41   setTitleBarColour(Colour::TITLEBARBACKGROUND);\r
42 \r
43   sl.setSurface(surface);\r
44   sl.setSurfaceOffset(0, 30);\r
45   sl.setDimensions(area.w, area.h - 30);\r
46 \r
47   // Load data from availableAudioChannels, currentAudioChannel and recInfo\r
48 \r
49   int i;\r
50   int selected = 0;\r
51 \r
52   for (i = 0; i < PES_AUDIO_END - PES_AUDIO_START; i++)\r
53   {\r
54     if (availableAudioChannels[i])\r
55     {\r
56       AudioChannel* ac = new AudioChannel();\r
57       ac->type = 0;\r
58       ac->name = NULL;\r
59       ac->pestype = PES_AUDIO_START + i;\r
60       if (i == currentAudioChannel) selected = i;\r
61       acl.push_back(ac);\r
62     }\r
63   }\r
64 \r
65   unsigned char numchan_recinfo = recInfo->numComponents;\r
66   unsigned char numchan_siz = acl.size();\r
67   int mp_audcounter = 0;\r
68   int ac3_counter = 0;\r
69   int ac3_offset = 0;\r
70 \r
71   for (i = 0; i < numchan_siz; i++)\r
72   {\r
73     AudioChannel* ac = acl[i];\r
74     if (ac)\r
75     {\r
76       if (ac->type==0)\r
77       {\r
78         ac3_offset++;\r
79       }\r
80     }\r
81   }\r
82 \r
83   unsigned char type;\r
84   char* lang;\r
85   char* description;\r
86   int type_int;\r
87 \r
88   for (i = 0; i < numchan_recinfo; i++)\r
89   {\r
90     if (recInfo->streams[i] != 2) continue; //not an audio component\r
91     type = recInfo->types[i];\r
92     lang = recInfo->languages[i];\r
93     description = recInfo->descriptions[i];\r
94     AudioChannel* ac = NULL;\r
95     type_int = 0;\r
96 \r
97     switch (type)\r
98     {\r
99       case 1: //mpaudio mono\r
100       case 3: //mpaudio stereo\r
101         if (mp_audcounter < numchan_siz) ac = acl[mp_audcounter];\r
102         type_int = 0;\r
103         break;\r
104       case 5: //ac3\r
105         if (ac3_counter + ac3_offset < numchan_siz) ac = acl[ac3_counter + ac3_offset];\r
106         type_int = 1;\r
107         break;\r
108     }\r
109 \r
110     if (ac)\r
111     {\r
112       if (ac->type == type_int)\r
113       {\r
114         if (description && (strlen(description) > 0))\r
115         {\r
116           ac->name = new char[strlen(description)+1];\r
117           strcpy(ac->name, description);\r
118         }\r
119         else if (lang && (strlen(lang) > 0))\r
120         {\r
121           ac->name = new char[strlen(lang)+1];\r
122           strcpy(ac->name, lang);\r
123         }\r
124       }\r
125     }\r
126 \r
127     switch (type_int)\r
128     {\r
129       case 0: //mpaudio\r
130         mp_audcounter++;\r
131         break;\r
132       case 1: //ac3\r
133         ac3_counter++;\r
134         break;\r
135     }\r
136   }\r
137 \r
138   // Now do display\r
139 \r
140   char tempString[300];\r
141   int slSelected;\r
142   int audioChannelListSize = acl.size();\r
143 \r
144   if (audioChannelListSize)\r
145   {\r
146     for(i = 0; i < audioChannelListSize; i++)\r
147     {\r
148       AudioChannel* ac = acl[i];\r
149       if (i == currentAudioChannel)\r
150         slSelected = 1;\r
151       else\r
152         slSelected = 0;\r
153 \r
154       if (ac->name)\r
155       {\r
156         sl.addOption(ac->name, (ULONG)ac, slSelected);\r
157       }\r
158       else\r
159       {\r
160         SNPRINTF(tempString, 299, "%lu", (ULONG)(ac->pestype - PES_AUDIO_START));\r
161         sl.addOption(tempString, (ULONG)ac, slSelected);\r
162       }\r
163     }\r
164   }\r
165   else\r
166   {\r
167     sl.addOption(tr("No audio channel data available"), 0, 1);\r
168   }\r
169 }\r
170 \r
171 VAudioSelector::~VAudioSelector()\r
172 {\r
173   int audioChannelListSize = acl.size();\r
174   for(int i = 0; i < audioChannelListSize; i++)\r
175   {\r
176     delete acl[i];\r
177   }\r
178   acl.clear();\r
179 \r
180   sl.clear();\r
181 }\r
182 \r
183 void VAudioSelector::draw()\r
184 {\r
185   View::draw();\r
186   sl.draw();\r
187 }\r
188 \r
189 int VAudioSelector::handleCommand(int command)\r
190 {\r
191   switch (command)\r
192   {\r
193     case Remote::BACK:\r
194     case Remote::OK:\r
195     {\r
196       return 4;\r
197     }\r
198     case Remote::DF_UP:\r
199     {\r
200       sl.up();\r
201       sl.draw();\r
202 \r
203       ViewMan::getInstance()->updateView(this);\r
204       //player->setAudioChannel((AudioChannel*)sl.getCurrentOptionData());\r
205 \r
206       return 2;\r
207     }\r
208     case Remote::DF_DOWN:\r
209     {\r
210       sl.down();\r
211       sl.draw();\r
212 \r
213       ViewMan::getInstance()->updateView(this);\r
214       //player->setAudioChannel((AudioChannel*)sl.getCurrentOptionData());\r
215 \r
216       return 2;\r
217     }\r
218   }\r
219 \r
220   return 0;\r
221 }\r