137 QWORD cnsSampleDuration,
139 INSSBuffer __RPC_FAR *pSample,
142 if( 0 != dwOutputNum )
156 hr = pSample->GetBufferAndLength( &pData, &cbData );
159 return( E_UNEXPECTED );
162 DEBUG_LOG((
" New Sample of length %d and PS time %d ms\n",
163 cbData, (
DWORD ) ( cnsSampleTime / 10000 ) ));
165 LPWAVEHDR pwh = (LPWAVEHDR)
new BYTE[
sizeof( WAVEHDR ) + cbData ];
169 DEBUG_LOG((
"OnSample OUT OF MEMORY! \n"));
173 return( E_UNEXPECTED );
176 pwh->lpData = (LPSTR)&pwh[1];
177 pwh->dwBufferLength = cbData;
178 pwh->dwBytesRecorded = cbData;
183 CopyMemory( pwh->lpData, pData, cbData );
187 mmr = waveOutPrepareHeader(
m_hwo, pwh,
sizeof(WAVEHDR) );
188 mmr = MMSYSERR_NOERROR;
190 if( mmr != MMSYSERR_NOERROR )
192 DEBUG_LOG((
"failed to prepare wave buffer, error=%lu\n" , mmr ));
195 return( E_UNEXPECTED );
198 mmr = waveOutWrite(
m_hwo, pwh,
sizeof(WAVEHDR) );
199 mmr = MMSYSERR_NOERROR;
201 if( mmr != MMSYSERR_NOERROR )
205 DEBUG_LOG((
"failed to write wave sample, error=%lu\n" , mmr ));
208 return( E_UNEXPECTED );
225 WCHAR wszFullUrl[ MAX_PATH ];
227 if( ( 0 == wcsstr( pszUrl, L
"\\\\" ) )
228 && ( 0 == wcsstr( pszUrl, L
":\\" ) )
229 && ( 0 == wcsstr( pszUrl, L
"://" ) ) )
234 LPWSTR pszCheck = _wfullpath( wszFullUrl, pszUrl, MAX_PATH );
236 if(
NULL == pszCheck )
238 DEBUG_LOG((
"internal error %lu\n" , GetLastError() ));
239 return E_UNEXPECTED ;
250 m_pszUrl =
new WCHAR[ wcslen( pszUrl ) + 1 ];
255 return( E_OUTOFMEMORY );
279 DEBUG_LOG((
"failed to create audio reader (hr=0x%08x)\n" , hr ));
287 if ( SUCCEEDED( hr ) )
292 if ( NS_E_NO_STREAM == hr )
294 DEBUG_LOG((
"Waiting for transmission to begin...\n" ));
300 DEBUG_LOG((
"failed to open (hr=0x%08x)\n", hr ));
311 DEBUG_LOG((
"failed to qi for header interface (hr=0x%08x)\n" , hr ));
317 hr =
m_pHeader->GetAttributeCount( 0, &wAttrCnt );
320 DEBUG_LOG((
"GetAttributeCount Failed (hr=0x%08x)\n" , hr ));
324 WCHAR *pwszName =
NULL;
327 for ( i = 0; i < wAttrCnt ; i++ )
331 WMT_ATTR_DATATYPE type;
334 hr =
m_pHeader->GetAttributeByIndex( i, &wStream,
NULL, &cchNamelen, &type,
NULL, &cbLength );
337 DEBUG_LOG((
"GetAttributeByIndex Failed (hr=0x%08x)\n" , hr ));
341 pwszName =
new WCHAR[ cchNamelen ];
342 pValue =
new BYTE[ cbLength ];
344 if(
NULL == pwszName ||
NULL == pValue )
350 hr =
m_pHeader->GetAttributeByIndex( i, &wStream, pwszName, &cchNamelen, &type, pValue, &cbLength );
353 DEBUG_LOG((
"GetAttributeByIndex Failed (hr=0x%08x)\n" , hr ));
362 case WMT_TYPE_STRING:
363 DEBUG_LOG((
"%ws: %ws\n" , pwszName, (WCHAR *) pValue ));
365 case WMT_TYPE_BINARY:
366 DEBUG_LOG((
"%ws: Type = Binary of Length %u\n" , pwszName, cbLength ));
369 DEBUG_LOG((
"%ws: %s\n" , pwszName, ( * ( (
BOOL * ) pValue) ? _T(
"true" ) : _T(
"false" ) ) ));
375 DEBUG_LOG((
"%ws: %I64u\n" , pwszName, *((QWORD *) pValue) ));
378 DEBUG_LOG((
"%ws: %I64x%I64x\n" , pwszName, *((QWORD *) pValue), *((QWORD *) pValue + 1) ));
381 DEBUG_LOG((
"%ws: Type = %d, Length %u\n" , pwszName, type, cbLength ));
408 hr =
m_pReader->GetOutputCount( &cOutputs );
411 DEBUG_LOG((
"failed GetOutputCount(), (hr=0x%08x)\n" , hr ));
417 DEBUG_LOG((
"Not audio only (cOutputs = %d).\n" , cOutputs ));
421 IWMOutputMediaProps *pProps;
422 hr =
m_pReader->GetOutputProps( 0, &pProps );
425 DEBUG_LOG((
"failed GetOutputProps(), (hr=0x%08x)\n" , hr ));
431 hr = pProps->GetMediaType(
NULL, &cbBuffer );
435 DEBUG_LOG((
"GetMediaType failed (hr=0x%08x)\n" , hr ));
439 WM_MEDIA_TYPE *pMediaType = ( WM_MEDIA_TYPE * )
new BYTE[cbBuffer] ;
441 hr = pProps->GetMediaType( pMediaType, &cbBuffer );
445 DEBUG_LOG((
"GetMediaType failed (hr=0x%08x)\n" , hr ));
451 if ( pMediaType->majortype != WMMEDIATYPE_Audio )
453 delete[] (
BYTE *) pMediaType ;
454 DEBUG_LOG((
"Not audio only (major type mismatch).\n" ));
455 return( E_UNEXPECTED );
461 WAVEFORMATEX *pwfx = ( WAVEFORMATEX * )pMediaType->pbFormat;
462 memcpy( &
m_wfx, pwfx,
sizeof( WAVEFORMATEX ) + pwfx->cbSize );
464 delete[] (
BYTE *)pMediaType ;
469 mmr = waveOutOpen( &
m_hwo,
475 mmr = MMSYSERR_NOERROR;
477 if( mmr != MMSYSERR_NOERROR )
480 DEBUG_LOG((
"failed to open wav output device, error=%lu\n" , mmr ));
481 return( E_UNEXPECTED );
487 QWORD cnsDuration = ( QWORD ) dwSecDuration * 10000000;
492 DEBUG_LOG((
"failed Start(), (hr=0x%08x)\n" , hr ));
virtual HRESULT STDMETHODCALLTYPE OnSample(DWORD dwOutputNum, QWORD cnsSampleTime, QWORD cnsSampleDuration, DWORD dwFlags, INSSBuffer __RPC_FAR *pSample, void __RPC_FAR *pvContext)