]> git.vomp.tv Git - vompclient.git/blob - audiowin.cc
Windows port
[vompclient.git] / audiowin.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 "audiowin.h"\r
22 #include "videowin.h"\r
23 \r
24 \r
25 \r
26 \r
27 \r
28 AudioWin::AudioWin()\r
29 {\r
30   initted = 0;\r
31   firstsynched=false;\r
32   winvolume=0;\r
33   volume=20;\r
34 \r
35 \r
36 \r
37 }\r
38 \r
39 AudioWin::~AudioWin()\r
40 {\r
41 \r
42 \r
43 }\r
44 \r
45 int AudioWin::init(UCHAR tstreamType)\r
46 {\r
47   if (initted) return 0;\r
48   initted = 1;\r
49   return 1;\r
50 }\r
51 \r
52 int AudioWin::shutdown()\r
53 {\r
54   if (!initted) return 0;\r
55   initted = 0;\r
56   return 1;\r
57 }\r
58 \r
59 int AudioWin::write(char *buf, int len)\r
60 {\r
61   return 0; //write(fdAudio, buf, len);\r
62 }\r
63 \r
64 int AudioWin::setStreamType(UCHAR type)\r
65 {\r
66   if (!initted) return 0;\r
67   return 1;\r
68 }\r
69 \r
70 int AudioWin::setChannel()\r
71 {\r
72   if (!initted) return 0;\r
73   return 1;\r
74 }\r
75 \r
76 int AudioWin::setSource()\r
77 {\r
78   if (!initted) return 0;\r
79   return 1;\r
80 }\r
81 \r
82 int AudioWin::sync()\r
83 {\r
84   if (!initted) return 0;\r
85   return 1;\r
86 }\r
87 \r
88 int AudioWin::play()\r
89 {\r
90   if (!initted) return 0;\r
91   firstsynched=false;\r
92 \r
93   return 1;\r
94 }\r
95 \r
96 int AudioWin::stop()\r
97 {\r
98   if (!initted) return 0;\r
99   return 1;\r
100 }\r
101 \r
102 int AudioWin::pause()\r
103 {\r
104   if (!initted) return 0;\r
105   return 1;\r
106 }\r
107 \r
108 int AudioWin::unPause()\r
109 {\r
110   if (!initted) return 0;\r
111   return 1;\r
112 }\r
113 \r
114 int AudioWin::reset()\r
115 {\r
116   if (!initted) return 0;\r
117   return 1;\r
118 }\r
119 \r
120 int AudioWin::setVolume(int tvolume)\r
121 {\r
122   // parameter: 0 for silence, 20 for full\r
123   if ((tvolume < 0) || (tvolume > 20)) return 0;\r
124   winvolume=((tvolume-20)*100*30)/20;\r
125   if (tvolume==0) winvolume=-10000;\r
126   ((VideoWin*)Video::getInstance())->SetAudioVolume(winvolume);\r
127 \r
128 \r
129   return 1;\r
130 }\r
131 \r
132 int AudioWin::mute()\r
133 {\r
134   if (!initted) return 0;\r
135   ((VideoWin*)Video::getInstance())->SetAudioState(false);\r
136   ((VideoWin*)Video::getInstance())->SetAudioVolume(-10000);\r
137   return 1;\r
138 }\r
139 \r
140 int AudioWin::unMute()\r
141 {\r
142   if (!initted) return 0;\r
143   ((VideoWin*)Video::getInstance())->SetAudioState(true);\r
144   ((VideoWin*)Video::getInstance())->SetAudioVolume(winvolume);\r
145   return 1;\r
146 }\r
147 \r
148 UINT AudioWin::DeliverMediaSample(MediaPacket packet,\r
149      UCHAR* buffer,\r
150      UINT *samplepos)\r
151 {\r
152   /*First Check, if we have an audio sample*/\r
153   VideoWin *vw=(VideoWin*)Video::getInstance();\r
154   IMediaSample* ms=NULL;\r
155   REFERENCE_TIME reftime1=0;\r
156   REFERENCE_TIME reftime2=0;\r
157 \r
158   UINT headerstrip=0;\r
159   if (packet.disconti) {\r
160     firstsynched=false;\r
161     vw->DeliverVideoMediaSample();\r
162   }\r
163 \r
164 \r
165 \r
166   /*Inspect PES-Header */\r
167 /*  UINT header_length=buffer[(packet.pos_buffer+8)%bufferlength]+8/*is this right*;\r
168 */\r
169   if (*samplepos==0) {//stripheader\r
170     headerstrip=buffer[packet.pos_buffer+8]+9/*is this right*/;\r
171     *samplepos+=headerstrip;\r
172     if ( packet.synched ) {\r
173       vw->DeliverAudioMediaSample();//write out old data\r
174    /*   if (packet.presentation_time<0) { //Preroll?\r
175         *samplepos=packet.length;//if we have not processed at least one\r
176         return packet.length;//synched packet ignore it!\r
177       }*/\r
178 \r
179       reftime1=packet.presentation_time;\r
180       reftime2=reftime1+1;\r
181       firstsynched=true;\r
182     } else {\r
183       if (!firstsynched) {//\r
184         *samplepos=packet.length;//if we have not processed at least one\r
185         return packet.length;//synched packet ignore it!\r
186       }\r
187     }\r
188   }\r
189   BYTE *ms_buf;\r
190   UINT ms_length;\r
191   UINT ms_pos;\r
192   UINT haveToCopy;\r
193   if (!vw->getCurrentAudioMediaSample(&ms) || ms==NULL) {// get the current sample\r
194     //samplepos=0;\r
195     MILLISLEEP(10);\r
196     return *samplepos;\r
197   }\r
198   ms_pos=ms->GetActualDataLength();\r
199   ms_length=ms->GetSize();\r
200   haveToCopy=min(ms_length-ms_pos,packet.length-*samplepos);\r
201   if ((ms_length-ms_pos)<1) {\r
202     vw->DeliverAudioMediaSample(); //we are full!\r
203     if (!vw->getCurrentAudioMediaSample(&ms) || ms==NULL) {// get the current sample\r
204       //samplepos=0;\r
205       MILLISLEEP(10);\r
206       return *samplepos;\r
207     }\r
208     ms_pos=ms->GetActualDataLength();\r
209     ms_length=ms->GetSize();\r
210     haveToCopy=min(ms_length-ms_pos,packet.length-*samplepos);\r
211   }\r
212   ms->GetPointer(&ms_buf);\r
213 \r
214   if (ms_pos==0) {//will only be changed on first packet\r
215     if (packet.disconti) {\r
216       ms->SetDiscontinuity(TRUE);\r
217     } else {\r
218       ms->SetDiscontinuity(FALSE);\r
219     }\r
220     if (packet.synched) {\r
221       ms->SetSyncPoint(TRUE);\r
222       ms->SetTime(&reftime1,&reftime2);\r
223 \r
224       //ms->SetTime(NULL,NULL);\r
225       ms->SetMediaTime(NULL, NULL);\r
226     if (reftime1<0) ms->SetPreroll(TRUE);\r
227     else ms->SetPreroll(FALSE);\r
228     }else {\r
229       ms->SetSyncPoint(FALSE);\r
230       ms->SetTime(NULL,NULL);\r
231       ms->SetMediaTime(NULL, NULL);\r
232     ms->SetPreroll(FALSE);\r
233      MessageBox(0,"here I'm","Hallo",0);\r
234     //  ms->SetSyncPoint(TRUE);\r
235     }\r
236   }\r
237 \r
238 \r
239   memcpy(ms_buf+ms_pos,buffer+packet.pos_buffer+*samplepos,haveToCopy);\r
240     ms->SetActualDataLength(haveToCopy+ms_pos);\r
241 \r
242   *samplepos+=haveToCopy;\r
243 \r
244   return haveToCopy+headerstrip;\r
245 \r
246 }\r
247 \r
248 long long AudioWin::SetStartOffset(long long curreftime, bool *rsync){\r
249   VideoWin *vw=(VideoWin*)Video::getInstance();\r
250   return vw->SetStartAudioOffset(curreftime,rsync);\r
251 }\r
252 \r
253 void AudioWin::ResetTimeOffsets() {\r
254   VideoWin *vw=(VideoWin*)Video::getInstance();\r
255   return vw->ResetTimeOffsets();\r
256 }\r
257 \r
258 #ifdef DEV\r
259 int AudioWin::test()\r
260 {\r
261   return 0;\r
262 }\r
263 #endif\r
264 \r