2 Copyright 2004-2005 Chris Tallon
\r
4 This file is part of VOMP.
\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
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
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
21 #include "audiowin.h"
\r
22 #include "videowin.h"
\r
28 AudioWin::AudioWin()
\r
39 AudioWin::~AudioWin()
\r
45 int AudioWin::init(UCHAR tstreamType)
\r
47 if (initted) return 0;
\r
52 int AudioWin::shutdown()
\r
54 if (!initted) return 0;
\r
59 int AudioWin::write(char *buf, int len)
\r
61 return 0; //write(fdAudio, buf, len);
\r
64 int AudioWin::setStreamType(UCHAR type)
\r
66 if (!initted) return 0;
\r
70 int AudioWin::setChannel()
\r
72 if (!initted) return 0;
\r
76 int AudioWin::setSource()
\r
78 if (!initted) return 0;
\r
82 int AudioWin::sync()
\r
84 if (!initted) return 0;
\r
88 int AudioWin::play()
\r
90 if (!initted) return 0;
\r
96 int AudioWin::stop()
\r
98 if (!initted) return 0;
\r
102 int AudioWin::pause()
\r
104 if (!initted) return 0;
\r
108 int AudioWin::unPause()
\r
110 if (!initted) return 0;
\r
114 int AudioWin::reset()
\r
116 if (!initted) return 0;
\r
120 int AudioWin::setVolume(int tvolume)
\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
132 int AudioWin::mute()
\r
134 if (!initted) return 0;
\r
135 ((VideoWin*)Video::getInstance())->SetAudioState(false);
\r
136 ((VideoWin*)Video::getInstance())->SetAudioVolume(-10000);
\r
140 int AudioWin::unMute()
\r
142 if (!initted) return 0;
\r
143 ((VideoWin*)Video::getInstance())->SetAudioState(true);
\r
144 ((VideoWin*)Video::getInstance())->SetAudioVolume(winvolume);
\r
148 UINT AudioWin::DeliverMediaSample(MediaPacket packet,
\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
158 UINT headerstrip=0;
\r
159 if (packet.disconti) {
\r
160 firstsynched=false;
\r
161 vw->DeliverVideoMediaSample();
\r
166 /*Inspect PES-Header */
\r
167 /* UINT header_length=buffer[(packet.pos_buffer+8)%bufferlength]+8/*is this right*;
\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
179 reftime1=packet.presentation_time;
\r
180 reftime2=reftime1+1;
\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
193 if (!vw->getCurrentAudioMediaSample(&ms) || ms==NULL) {// get the current sample
\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
208 ms_pos=ms->GetActualDataLength();
\r
209 ms_length=ms->GetSize();
\r
210 haveToCopy=min(ms_length-ms_pos,packet.length-*samplepos);
\r
212 ms->GetPointer(&ms_buf);
\r
214 if (ms_pos==0) {//will only be changed on first packet
\r
215 if (packet.disconti) {
\r
216 ms->SetDiscontinuity(TRUE);
\r
218 ms->SetDiscontinuity(FALSE);
\r
220 if (packet.synched) {
\r
221 ms->SetSyncPoint(TRUE);
\r
222 ms->SetTime(&reftime1,&reftime2);
\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
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
239 memcpy(ms_buf+ms_pos,buffer+packet.pos_buffer+*samplepos,haveToCopy);
\r
240 ms->SetActualDataLength(haveToCopy+ms_pos);
\r
242 *samplepos+=haveToCopy;
\r
244 return haveToCopy+headerstrip;
\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
253 void AudioWin::ResetTimeOffsets() {
\r
254 VideoWin *vw=(VideoWin*)Video::getInstance();
\r
255 return vw->ResetTimeOffsets();
\r
259 int AudioWin::test()
\r