rtoss - Blame information for rev 26

Subversion Repositories:
Rev:
Rev Author Line No. Line
14 roytam 1 #include <windows.h>
2 #include "maplay.h"
3 #include "helper.h"
4 #include "player.h"
5  
6 void CPlayer::NetStreamingThread()
7 {
26 roytam 8         int i;
14 roytam 9         BYTE bRead[NET_READ_BUFF_LEN];
10         DWORD cbInBuf;
11  
12         m_StreamingStatus = MAP_STREAMING_CONNECTING;
13         UpdateStatus(MAP_STATUS_WAIT);
14  
15         if (!m_Receiver.Connect()) {
16                 UnpreparePlayback(FALSE, TRUE);
17                 return;
18         }
19  
20         m_StreamingStatus = MAP_STREAMING_BUFFERING;
21  
26 roytam 22         if (!WaitForPrebuffering(m_Receiver.GetPrebufferingCount())) {
14 roytam 23                 UnpreparePlayback(FALSE, TRUE);
24                 return;
25         }
26  
26 roytam 27         for (i = 0; i < m_Receiver.GetPrebufferingCount(); i++) {
28                 if (!m_Receiver.Read(bRead, NET_READ_BUFF_LEN, &cbInBuf)) {
29                         UnpreparePlayback(FALSE, TRUE);
30                         return;
31                 }
32  
33                 NetCheckStreamId3Tag(bRead, cbInBuf);
34  
35                 if (NetParseMpegStream(bRead, cbInBuf)) {
36                         m_fNet = NET_OPEN_MPEG;
37                         break;
38                 }
39                 else if (NetParseOvStream(bRead, cbInBuf)) {
40                         m_fNet = NET_OPEN_OV;
41                         break;
42                 }
43                 else if (PlugInParseStream(bRead, cbInBuf)) {
44                         m_fNet = NET_OPEN_PLUGIN;
45                         break;
46                 }
14 roytam 47         }
48  
49         if (!PreparePlayback()) {
50                 UnpreparePlayback(FALSE, TRUE);
51                 return;
52         }
53  
54         m_StreamingStatus = MAP_STREAMING_CONNECTED;
55         UpdateStatus(MAP_STATUS_PLAY);
56  
57         if (m_fNet == NET_OPEN_OV)
58                 NetOvStreaming(bRead, cbInBuf);
59         else if (m_fNet == NET_OPEN_PLUGIN)
60                 PlugInStreaming(bRead, cbInBuf);
61         else
62                 NetMpegStreaming(bRead, cbInBuf);
63 }
64  
65 void CPlayer::NetStop()
66 {
67         if (m_pOvd_buf) {
68                 ovd_uninit_stream(m_pOvd_buf);
69                 m_pOvd_buf = NULL;
70         }
71         *m_szOvdTitle = NULL;
72  
73         PlugInStopStreaming();
74 }
75  
76 void CPlayer::NetClose()
77 {
78         m_fNet = NET_OPEN_NONE;
79         m_StreamingStatus = MAP_STREAMING_DISABLED;
80 }
81  
82 BOOL CPlayer::NetParseMpegStream(LPBYTE pbBuf, DWORD cbBuf)
83 {
84         DWORD i = 0;
85         MPEG_AUDIO_INFO info;
86         while (i < cbBuf - 4) {
87                 if (ParseHeader(pbBuf + i, &info)) {
88                         if (i + info.nFrameSize < cbBuf - 4) {
89                                 if (CheckAudioHeader(pbBuf + i + info.nFrameSize)) {
90                                         m_Info = info;
91                                         break;
92                                 }
93                         }
94                 }
95                 i++;
96         }
97         if (m_Info.nVersion == 0 || m_Info.nLayer == 0 ||
98                 m_Info.nSamplingRate == 0 || m_Info.nChannels == 0)
99                 return FALSE;
100  
101         return TRUE;
102 }
103  
104 BOOL CPlayer::NetReconnect()
105 {
106         if (m_Receiver.IsEos()) {
107                 UnpreparePlayback(TRUE);
108                 return FALSE;
109         }
110  
111         if (!m_Receiver.IsShoutcast()) {
112                 UnpreparePlayback(TRUE);
113                 return FALSE;
114         }
115  
116         MAP_STATUS fStatus = m_Status;
117         m_StreamingStatus = MAP_STREAMING_CONNECTING;
118         UpdateStatus(MAP_STATUS_WAIT);
119  
120         m_Receiver.Disconnect();
121         if (!m_Receiver.Connect()) {
122                 UnpreparePlayback(FALSE, TRUE);
123                 return FALSE;
124         }
125  
126         m_StreamingStatus = MAP_STREAMING_BUFFERING;
127  
128         if (!WaitForPrebuffering()) {
129                 UnpreparePlayback(FALSE, TRUE);
130                 return FALSE;
131         }
132  
133         m_StreamingStatus = MAP_STREAMING_CONNECTED;
134         UpdateStatus(m_Status == MAP_STATUS_WAIT ? fStatus : m_Status);
135         return TRUE;
136 }
137  
138 void CPlayer::NetMpegStreaming(LPBYTE pbBuf, DWORD cbBuf)
139 {
140         DWORD cbInBuf, cbInBufLeft = 0;
141         cbInBuf = cbBuf;
142  
143         while (TRUE) {
144                 if (m_fStop) {
145                         UnpreparePlayback();
146                         return;
147                 }
148  
149                 if (m_Receiver.GetBufferingCount() < 2) {
150                         while (TRUE) {
151                                 Sleep(1);
152                                 if (m_Output.GetBufferingCount() < 1)
153                                         break;
154                                 if (m_Receiver.GetBufferingCount() > 1)
155                                         goto read;
156                                 if (m_fStop) {
157                                         UnpreparePlayback();
158                                         return;
159                                 }
160                         }
161  
162                         if (!NetReconnect())
163                                 return;
164  
165                         m_Output.Pause(TRUE);
166                         m_fPlay = TRUE;
167                 }
168  
169 read:
170                 if (!m_Receiver.Read(pbBuf + cbInBufLeft, NET_READ_BUFF_LEN - cbInBufLeft, &cbInBuf) || !cbInBuf) {
171                         UnpreparePlayback(TRUE);
172                         return;
173                 }
174  
175                 cbInBufLeft += cbInBuf;
176                 cbInBuf = 0;
177  
178                 if (MpgRender(pbBuf, cbInBufLeft, &cbInBuf) == MAD_FATAL_ERR) {
179                         UnpreparePlayback(FALSE, TRUE);
180                         return;
181                 }
182  
183                 memmove(pbBuf, pbBuf + cbInBuf, cbInBufLeft - cbInBuf);
184                 cbInBufLeft -= cbInBuf;
185         }
186 }
187  
188 BOOL CPlayer::NetParseOvStream(LPBYTE pbBuf, DWORD cbBuf)
189 {
190         if (cbBuf > OVD_STREAM_BUF_LEN)
191                 return FALSE;
192  
193         m_pOvd_buf = ovd_init_stream();
194         memcpy(m_pOvd_buf->buf, pbBuf, min(cbBuf, OVD_STREAM_BUF_LEN));
195         if (!ovd_parse_stream(m_pOvd_buf))
196                 return FALSE;
197  
198         ovd_info oi;
199         memset(&oi, 0, sizeof(oi));
200         memset(&m_Info, 0, sizeof(m_Info));
201         if (!ovd_get_stream_info(m_pOvd_buf, &oi))
202                 return FALSE;
203  
204         m_Info.nChannels = oi.channels;
205         m_Info.nSamplingRate = oi.rate;
206         m_Info.nBitRate = oi.bitrate_nominal / 1000;
207         m_Info.nFrameSize = 0;
208         m_Info.nSamplesPerFrame = 0;
209  
210         if (m_Info.nSamplingRate == 0 || m_Info.nChannels == 0)
211                 return FALSE;
212  
213         return TRUE;
214 }
215  
216 void CPlayer::NetOvStreaming(LPBYTE pbBuf, DWORD cbBuf)
217 {
218         int nRet, nOutput;
219         if (cbBuf < OVD_STREAM_BUF_LEN) {
220                 UnpreparePlayback(FALSE, TRUE);
221                 return;
222         }
223  
224         ovd_comment comment;
225  
226         while (TRUE) {
227                 ovd_get_stream_comment(m_pOvd_buf, &comment);
228                 if (_tcslen(comment.szTitle)) {
229                         if (_tcslen(comment.szArtist))
230                                 wsprintf(m_szOvdTitle, _T("%s - %s"), comment.szArtist, comment.szTitle);
231                         else
232                                 _tcscpy(m_szOvdTitle, comment.szTitle);
233                         PostCallbackMessage(MAP_MSG_STREAM_TITLE, (WPARAM)m_szOvdTitle, 0);
234                 }
235  
236                 if (m_fStop) {
237                         UnpreparePlayback();
238                         return;
239                 }
240  
241                 if (m_Receiver.GetBufferingCount() < 2) {
242                         while (TRUE) {
243                                 Sleep(1);
244                                 if (m_Output.GetBufferingCount() < 1)
245                                         break;
246                                 if (m_Receiver.GetBufferingCount() > 1)
247                                         goto read;
248                                 if (m_fStop) {
249                                         UnpreparePlayback();
250                                         return;
251                                 }
252                         }
253  
254                         if (!NetReconnect())
255                                 return;
256  
257                         m_Output.Pause(TRUE);
258                         m_fPlay = TRUE;
259  
260                         DWORD dwRead;
261                         if (!m_Receiver.Read(pbBuf, cbBuf, &dwRead) || !dwRead) {
262                                 UnpreparePlayback(TRUE);
263                                 return;
264                         }
265  
266                         ovd_uninit_stream(m_pOvd_buf);
267                         m_pOvd_buf = NULL;
268                         if (!NetParseOvStream(pbBuf, cbBuf)) {
269                                 UnpreparePlayback(TRUE);
270                                 return;
271                         }
272                 }
273  
274 read:
275                 if (m_pOvd_buf->len) {
276                         if (!m_Receiver.Read((BYTE*)m_pOvd_buf->buf, OVD_STREAM_BUF_LEN, &m_pOvd_buf->len) || !m_pOvd_buf->len) {
277                                 UnpreparePlayback(TRUE);
278                                 return;
279                         }
280                 }
281  
282                 if (!m_pOutHdr) {
283                         m_pOutHdr = m_Output.GetBuffer();
284                         m_cbOutBufLeft = m_cbOutBuf;
285                 }
286  
287                 nRet = ovd_decode_stream(m_pOvd_buf,
288                         (BYTE*)m_pOutHdr->lpData + (m_cbOutBuf - m_cbOutBufLeft), m_cbOutBufLeft, &nOutput);
289  
290                 Preamp((LPBYTE)m_pOutHdr->lpData + (m_cbOutBuf - m_cbOutBufLeft), nOutput);
291  
292                 m_cbOutBufLeft -= nOutput;
293  
294                 switch (nRet) {
295                 case OVD_FATAL_ERR:
296                 case OVD_ERR:
297                         UnpreparePlayback(FALSE, TRUE);
298                         break;
299                 case OVD_EOF:
300                         UnpreparePlayback(TRUE);
301                         return;
302                 case OVD_NEED_MORE_OUTPUT:
303                         OutputBuffer(m_pOutHdr, m_cbOutBuf - m_cbOutBufLeft);
304                         m_pOutHdr = NULL;
305                         break;
306                 }
307         }
308 }
26 roytam 309  
310 void CPlayer::NetCheckStreamId3Tag(LPBYTE pbBuf, DWORD cbBuf)
311 {
312         ID3TAGV1 tag = {0};
313         TCHAR szName[MAX_URL] = {0};
314  
315         if (ParseId3TagV2(pbBuf, cbBuf, &tag)) {
316                 if (_tcslen(tag.szArtist) && _tcslen(tag.szTrack)) {
317                         if (_tcslen(tag.szArtist) + _tcslen(tag.szTrack) + _tcslen(_T(" - ")) < sizeof(szName) / sizeof(WCHAR)) {
318                                 wsprintf(szName, _T("%s - %s"), tag.szArtist, tag.szTrack);
319                         }
320                         else {
321                                 _tcsncpy(szName, tag.szTrack, sizeof(szName) / sizeof(TCHAR));
322                                 szName[MAX_URL - 1] = NULL;
323                         }
324                 }
325                 else if (_tcslen(tag.szTrack)) {
326                         _tcsncpy(szName, tag.szTrack, sizeof(szName) / sizeof(TCHAR));
327                         szName[MAX_URL - 1] = NULL;
328                 }
329  
330                 if (_tcslen(szName)) {
331                         m_Receiver.SetStreamName(szName);
332                 }
333         }
334 }