hxaudev.cpp
上传用户:zhongxx05
上传日期:2007-06-06
资源大小:33641k
文件大小:19k
源码类别:

Symbian

开发平台:

C/C++

  1. /* ***** BEGIN LICENSE BLOCK ***** 
  2.  * Version: RCSL 1.0/RPSL 1.0 
  3.  *  
  4.  * Portions Copyright (c) 1995-2002 RealNetworks, Inc. All Rights Reserved. 
  5.  *      
  6.  * The contents of this file, and the files included with this file, are 
  7.  * subject to the current version of the RealNetworks Public Source License 
  8.  * Version 1.0 (the "RPSL") available at 
  9.  * http://www.helixcommunity.org/content/rpsl unless you have licensed 
  10.  * the file under the RealNetworks Community Source License Version 1.0 
  11.  * (the "RCSL") available at http://www.helixcommunity.org/content/rcsl, 
  12.  * in which case the RCSL will apply. You may also obtain the license terms 
  13.  * directly from RealNetworks.  You may not use this file except in 
  14.  * compliance with the RPSL or, if you have a valid RCSL with RealNetworks 
  15.  * applicable to this file, the RCSL.  Please see the applicable RPSL or 
  16.  * RCSL for the rights, obligations and limitations governing use of the 
  17.  * contents of the file.  
  18.  *  
  19.  * This file is part of the Helix DNA Technology. RealNetworks is the 
  20.  * developer of the Original Code and owns the copyrights in the portions 
  21.  * it created. 
  22.  *  
  23.  * This file, and the files included with this file, is distributed and made 
  24.  * available on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER 
  25.  * EXPRESS OR IMPLIED, AND REALNETWORKS HEREBY DISCLAIMS ALL SUCH WARRANTIES, 
  26.  * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, FITNESS 
  27.  * FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. 
  28.  * 
  29.  * Technology Compatibility Kit Test Suite(s) Location: 
  30.  *    http://www.helixcommunity.org/content/tck 
  31.  * 
  32.  * Contributor(s): 
  33.  *  
  34.  * ***** END LICENSE BLOCK ***** */ 
  35. #include "hxtypes.h"
  36. #if defined( _WINDOWS ) || defined( _WIN32 )
  37. #include <windows.h>
  38. #include <mmsystem.h>
  39. #endif /*defined( _WINDOWS ) || defined( _WIN32 )*/
  40. #ifdef _UNIX
  41. #include <signal.h>
  42. #endif
  43. #include "hlxclib/stdio.h"
  44. #include "hlxclib/string.h"
  45. #include "hxresult.h"
  46. #include "cbqueue.h"
  47. #include "cpqueue.h"
  48. #include "hxslist.h"
  49. #include "hxcom.h"
  50. #include "hxausvc.h"
  51. #include "hxengin.h"
  52. #include "ihxpckts.h"   
  53. #include "timeval.h"
  54. #include "hxaudev.h"
  55. #ifdef _UNIX
  56. #include "hxprefs.h"
  57. extern IHXPreferences* z_pIHXPrefs;
  58. #endif
  59. #if defined( _WINDOWS ) || defined( _WIN32 )
  60. #include "winaudio.h"
  61. #if defined (HELIX_FEATURE_DIRECT_SOUND)
  62. #include "hxaudevds.h"
  63. #endif
  64. #endif
  65. #if defined( _LINUX ) || defined ( _FREEBSD )
  66. #include "audlinux_oss.h"
  67. #if defined(HELIX_FEATURE_ESOUND)
  68. #include "audlinux_esound.h"
  69. #endif
  70. #if defined(HELIX_FEATURE_ALSA)
  71. #include "audlinux_alsa.h"
  72. #endif
  73. #endif
  74. #if defined( __QNXNTO__ )
  75. #include "audqnx.h"
  76. #endif 
  77. #if defined( _IRIX )
  78. #include "audirix.h"
  79. #endif
  80. #if defined( _SUN ) && !defined( _SOLARIS )
  81. #include "audsunos.h"
  82. #endif
  83. #if defined( _AIX ) 
  84. #include "audaix.h"
  85. #endif
  86. #if defined( _SOLARIS )
  87. #include "audSolaris.h"
  88. #endif
  89. #if defined( _MACINTOSH ) || defined( _MAC_UNIX )
  90. #include "macaudio.h"
  91. #endif
  92. #if defined( _BEOS )
  93. #include "audbeos.h"
  94. #endif
  95. #if defined( _HPUX )
  96. #include "audhpux.h"
  97. #endif
  98. #if defined(_SYMBIAN)
  99. #include "audsymbian.h"
  100. #endif
  101. #if defined(_OPENWAVE)
  102. #include "audopwave.h"
  103. #endif
  104. #include "hxheap.h"
  105. #ifdef _DEBUG
  106. #undef HX_THIS_FILE
  107. static const char HX_THIS_FILE[] = __FILE__;
  108. #endif
  109. /************************************************************************
  110.  *  Method:
  111.  * IHXAudioDevice::~CHXAudioDevice()
  112.  * Purpose:
  113.  * Destructor. Clean up and set free.
  114.  */
  115. CHXAudioDevice::~CHXAudioDevice()
  116. {
  117.     HX_RELEASE(m_pDeviceResponse);
  118.     HX_RELEASE(m_pScheduler);
  119.     HX_RELEASE(m_pContext);
  120.     m_uMinVolume = 0;
  121.     m_uMaxVolume = 0;
  122.     m_uCurVolume = 0;
  123.     m_uSampFrameSize = 0;
  124.     m_ulCurrentTime = 0;
  125.     m_ulLastSysTime = 0;
  126.     m_ulGranularity = 0;
  127.     m_pdevName = 0;
  128. }
  129. /////////////////////////////////////////////////////////////////////////
  130. //  Method:
  131. //      IUnknown::QueryInterface
  132. //  Purpose:
  133. //      Implement this to export the interfaces supported by your
  134. //      object.
  135. //
  136. STDMETHODIMP CHXAudioDevice::QueryInterface(REFIID riid, void** ppvObj)
  137. {
  138.     QInterfaceList qiList[] =
  139.         {
  140.             { GET_IIDHANDLE(IID_IHXAudioDevice), (IHXAudioDevice*)this },
  141.             { GET_IIDHANDLE(IID_IUnknown), (IUnknown*)(IHXAudioDevice*)this },
  142.         };
  143.     
  144.     return ::QIFind(qiList, QILISTSIZE(qiList), riid, ppvObj);
  145. }
  146. /////////////////////////////////////////////////////////////////////////
  147. //  Method:
  148. //      IUnknown::AddRef
  149. //  Purpose:
  150. //      Everyone usually implements this the same... feel free to use
  151. //      this implementation.
  152. //
  153. STDMETHODIMP_(ULONG32) CHXAudioDevice::AddRef()
  154. {
  155.     return InterlockedIncrement(&m_lRefCount);
  156. }
  157. /////////////////////////////////////////////////////////////////////////
  158. //  Method:
  159. //      IUnknown::Release
  160. //  Purpose:
  161. //      Everyone usually implements this the same... feel free to use
  162. //      this implementation.
  163. //
  164. STDMETHODIMP_(ULONG32) CHXAudioDevice::Release()
  165. {
  166.     if (InterlockedDecrement(&m_lRefCount) > 0)
  167.     {
  168.         return m_lRefCount;
  169.     }
  170.     delete this;
  171.     return 0;
  172. }
  173. /*
  174.  *  IHXAudioDevice methods
  175.  */
  176. /************************************************************************
  177.  *  Method:
  178.  * IHXAudioDevice::Create
  179.  * Purpose:
  180.  * Create the audio device.
  181.  */
  182. CHXAudioDevice* CHXAudioDevice::Create(IHXPreferences* pPrefs)
  183. {
  184.     CHXAudioDevice* pAudioDevice = NULL;
  185.    /*
  186.     *   The Mac compiler has trouble w/ overly complicated expressions to the
  187.     *   preprocessor (that's why the #if... #endif...  #if... #endif blocks).
  188.     */
  189. #if defined( _SUN ) && !defined( _SOLARIS )
  190.     pAudioDevice = new CAudioOutSun;
  191. #endif
  192. #if defined( _AIX)
  193.     pAudioDevice = new CAudioOutAIX;
  194. #endif
  195. #if defined( _SOLARIS )
  196.     pAudioDevice = new CAudioOutSolaris();
  197. #endif
  198. #if defined( _LINUX ) ||  defined( _FREEBSD ) || defined ( _NETBSD)
  199.     const int kOSS = 1;
  200.     const int kESound = 2;
  201.     const int kALSA = 3;
  202.     int nSoundDriver = kOSS;
  203.     int nSoundDriverRequested;
  204.     IHXBuffer* pBuffer  = NULL;
  205.     HX_ASSERT( z_pIHXPrefs );
  206.     if( z_pIHXPrefs )
  207.     {
  208.         z_pIHXPrefs->ReadPref("SoundDriver", pBuffer);
  209.         if (pBuffer)
  210.         {
  211.             nSoundDriverRequested = atoi((const char*)pBuffer->GetBuffer());
  212.             if(nSoundDriverRequested == kOSS)
  213.             {
  214.                 nSoundDriver = kOSS;
  215.             }
  216.             else if(nSoundDriverRequested == kESound)
  217.             {
  218. #ifdef HELIX_FEATURE_ESOUND
  219.                 nSoundDriver = kESound;
  220. #endif
  221.             }
  222.             else if(nSoundDriverRequested == kALSA)
  223.             {
  224. #ifdef HELIX_FEATURE_ALSA
  225.                 nSoundDriver = kALSA;
  226. #endif
  227.             }
  228.             else
  229.             {
  230.                 //Unknown sound driver -- maybe our config file was generated
  231.                 //by a future version of this driver. Use OSS as a fall-back.
  232.                 printf("Unknown sound driver in preferences. Falling back to OSS.n");
  233.                 nSoundDriver = kOSS;
  234.             }
  235.             HX_RELEASE(pBuffer);
  236.         }
  237.     }
  238. #if defined(HELIX_FEATURE_ESOUND)    
  239.     if( nSoundDriver == kESound )
  240.     {
  241.         pAudioDevice = new CAudioOutESound();
  242.     }
  243. #endif        
  244. #if defined(HELIX_FEATURE_ALSA)
  245.     if( nSoundDriver == kALSA )
  246.     {
  247.         pAudioDevice = new CAudioOutLinuxAlsa();
  248.     }
  249. #endif
  250.     if( nSoundDriver == kOSS || !pAudioDevice )
  251.     {
  252.         pAudioDevice = new CAudioOutLinux();
  253.     }
  254.   
  255. #endif
  256. #if defined( __QNXNTO__ )
  257.     pAudioDevice = new CAudioOutQNX;
  258. #endif 
  259. #if defined( _IRIX )
  260.     pAudioDevice = new CAudioOutIrix;
  261. #endif 
  262. #if defined( _BEOS )
  263.     pAudioDevice = new CAudioOutBeOS;
  264. #endif
  265. #if defined(_SYMBIAN)
  266.     pAudioDevice = CAudioOutSymbian::NewL();
  267. #endif    
  268. #if defined(_OPENWAVE)
  269.     // currently, audio unsupported for arm
  270. #ifndef _OPENWAVE_ARMULATOR
  271.     pAudioDevice = new CAudioOutOpenwave;
  272. #endif
  273. #endif
  274. #if defined( _WINDOWS )
  275.     
  276. #if defined (HELIX_FEATURE_DIRECT_SOUND)
  277.     BOOL bUseDS = FALSE;
  278.     if(pPrefs)
  279.     {
  280.         IHXBuffer* pBuff = NULL;
  281.         pPrefs->ReadPref("UseDirectSound", pBuff);
  282.         if (pBuff)
  283.         {
  284.             bUseDS = (::atoi((const char*)pBuff->GetBuffer()) == 1);
  285.             HX_RELEASE(pBuff);
  286.         }
  287.     }
  288.     if(bUseDS)
  289.         pAudioDevice = new CHXAudioDeviceDS;
  290.     else
  291.         pAudioDevice = new CAudioOutWindows;
  292. #else
  293.     pAudioDevice = new CAudioOutWindows;
  294. #endif //HELIX_FEATURE_DIRECT_SOUND
  295. #endif
  296. #if defined( _MACINTOSH ) || defined( _MAC_UNIX )
  297.     pAudioDevice = new CAudioOutMac;
  298. #endif
  299. #if defined _HPUX
  300.     pAudioDevice = new CAudioOutHPUX;
  301. #endif
  302.     return( pAudioDevice );
  303. }
  304. void
  305. CHXAudioDevice::Init(IUnknown* pContext)
  306. {
  307.     HX_ASSERT(m_pContext == NULL && pContext != NULL);
  308.     HX_RELEASE(m_pContext);
  309.     
  310.     m_pContext = pContext;
  311.     
  312.     if (m_pContext)
  313.     {
  314.         m_pContext->AddRef();
  315.         _initAfterContext();
  316.     }
  317. }
  318. void CHXAudioDevice::_initAfterContext()
  319. {}
  320. /************************************************************************
  321.  *  Method:
  322.  * IHXAudioDevice::Open
  323.  * Purpose:
  324.  * Open the audio device using the given format.
  325.  */
  326. STDMETHODIMP CHXAudioDevice::Open
  327. (
  328.     const HXAudioFormat* pAudioFormat,
  329.     IHXAudioDeviceResponse* pDeviceResponse
  330. )
  331. {
  332.     HX_RESULT theErr = HXR_OK;
  333.     m_pDeviceResponse = pDeviceResponse;
  334.     if (m_pDeviceResponse)
  335.     {
  336.         m_pDeviceResponse->AddRef();
  337.     }
  338.     memcpy( &m_AudioFmt, pAudioFormat, sizeof(HXAudioFormat) ); /* Flawfinder: ignore */
  339.     theErr = _Imp_Open( pAudioFormat );
  340.     
  341.     if (!theErr)
  342.     {
  343.         m_eState = E_DEV_OPENED;
  344.     }
  345.     return theErr;
  346. }
  347. /************************************************************************
  348.  *  Method:
  349.  * IHXAudioDevice::Close
  350.  * Purpose:
  351.  *   Close the audio device. 
  352.  */
  353. STDMETHODIMP CHXAudioDevice::Close
  354.     const  BOOL bFlush
  355. )
  356. {
  357.     HX_RESULT  theErr = HXR_OK;
  358.     if ( bFlush )
  359.     {
  360.         theErr = Reset();
  361.     }
  362.     else
  363.     {
  364.         theErr = Drain();
  365.     }
  366.     if ( !theErr )
  367.         theErr = _Imp_Close();
  368.     
  369.     m_eState = E_DEV_CLOSED;
  370.     
  371.     return HXR_OK;
  372. }
  373. HX_RESULT CHXAudioDevice::Seek( UINT32  ulSeekTime)
  374. {
  375.     _Imp_Seek(ulSeekTime);
  376.     return HXR_OK;
  377. }
  378. /************************************************************************
  379.  *  Method:
  380.  * IHXAudioDevice::Pause
  381.  * Purpose:
  382.  * Pause the audio device.
  383.  */
  384. STDMETHODIMP CHXAudioDevice::Pause
  385. (
  386. )
  387. {
  388.     HX_RESULT  theErr = HXR_OK;
  389.     m_bPaused = TRUE;
  390.     theErr = _Imp_Pause();
  391.     m_eState = E_DEV_PAUSED;
  392.     return HXR_OK;
  393. }
  394. /************************************************************************
  395.  *  Method:
  396.  * IHXAudioDevice::Resume
  397.  * Purpose:
  398.  * Resume the audio device.
  399.  */
  400. STDMETHODIMP CHXAudioDevice::Resume
  401. (
  402. )
  403. {
  404.     HX_RESULT  theErr = HXR_OK;
  405.     m_bPaused = FALSE;
  406.     theErr = _Imp_Resume();
  407.     m_eState = E_DEV_RESUMED;
  408.     return HXR_OK;
  409. }
  410. /************************************************************************
  411.  *  Method:
  412.  * IHXAudioDevice::Write
  413.  * Purpose:
  414.  * Write data to the audio device.
  415.  */
  416. STDMETHODIMP CHXAudioDevice::Write
  417. (
  418.     const HXAudioData* pAudioHdr
  419. )
  420. {
  421.     HX_RESULT theErr = _Imp_Write( pAudioHdr );
  422.     return theErr;
  423. }
  424. /************************************************************************
  425.  *  Method:
  426.  * IHXAudioDevice::SetCallback
  427.  * Purpose:
  428.  */
  429. /*
  430. STDMETHODIMP CHXAudioDevice::SetCallback
  431. )
  432. {
  433.     return HXR_OK;
  434. }
  435. */
  436. /************************************************************************
  437.  *  Method:
  438.  * IHXAudioDevice::SetBuffering
  439.  * Purpose:
  440.  * Let the Audio Device manage the audio buffers.
  441.  */
  442. STDMETHODIMP CHXAudioDevice::SetBuffering
  443. (
  444.     const BOOL bSetBuffering
  445. )
  446. {
  447.     m_bBuffer = bSetBuffering;
  448.     return HXR_OK;
  449. }
  450. /************************************************************************
  451.  *  Method:
  452.  * IHXAudioDevice::InitVolume
  453.  * Purpose:
  454.  * Initialize the volume. Return TRUE if device supports volume.
  455.  */
  456. STDMETHODIMP_(BOOL) CHXAudioDevice::InitVolume
  457. (
  458.     const UINT16    uMinVolume,
  459.     const UINT16    uMaxVolume
  460. )
  461. {
  462.     m_uMinVolume = uMinVolume;
  463.     m_uMaxVolume = uMaxVolume;
  464.     return (_Imp_SupportsVolume());
  465. }
  466. /************************************************************************
  467.  *  Method:
  468.  * IHXAudioDevice::SetVolume
  469.  * Purpose:
  470.  * Set the volume.
  471.  */
  472. STDMETHODIMP CHXAudioDevice::SetVolume 
  473. (
  474.     const UINT16    uVolume
  475. )
  476. {
  477.     m_uCurVolume = uVolume;
  478.     return _Imp_SetVolume( uVolume );
  479. }
  480. /************************************************************************
  481.  *  Method:
  482.  * IHXAudioDevice::GetVolume
  483.  * Purpose:
  484.  * Get the volume.
  485.  */
  486. STDMETHODIMP_(UINT16) CHXAudioDevice::GetVolume()
  487. {
  488.     return _Imp_GetVolume();
  489. }
  490. /************************************************************************
  491.  *  Method:
  492.  * IHXAudioDevice::Reset
  493.  * Purpose:
  494.  * Reset audio. Stop playback and flush all buffers.
  495.  */
  496. STDMETHODIMP CHXAudioDevice::Reset ()
  497. {
  498.     return( _Imp_Reset() );
  499. }
  500. /************************************************************************
  501.  *  Method:
  502.  * IHXAudioDevice::Drain
  503.  * Purpose:
  504.  * Drain remaining audio with playback. 
  505.  */
  506. STDMETHODIMP CHXAudioDevice::Drain()
  507. {
  508.     return( _Imp_Drain() );
  509. }
  510. /************************************************************************
  511.  *  Method:
  512.  *              IHXAudioDevice::CheckFormat
  513.  *      Purpose:
  514.  * Check to see if the audio device will accept this audio
  515.  * format.
  516.  */
  517. STDMETHODIMP CHXAudioDevice::CheckFormat( const HXAudioFormat* pFormat )
  518. {
  519.     return( _Imp_CheckFormat( pFormat ) );
  520. }
  521. /************************************************************************
  522.  *  Method:
  523.  * IHXAudioDevice::GetCurrentAudioTime
  524.  * Purpose:
  525.  * Get the current time from the audio device.
  526.  *              We added this to support the clock available in the
  527.  *              Window's audio driver.
  528.  */
  529. STDMETHODIMP CHXAudioDevice::GetCurrentAudioTime 
  530. (
  531.     ULONG32& ulCurrentTime
  532. )
  533. {
  534.     return _Imp_GetCurrentTime( ulCurrentTime );
  535. }
  536. /************************************************************************
  537.  *  Method:
  538.  * CHXAudioDevice::GetAudioFd
  539.  * Purpose:
  540.  */
  541. STDMETHODIMP CHXAudioDevice::GetAudioFd()
  542. {
  543. return _Imp_GetAudioFd();
  544. }
  545. /************************************************************************
  546.  *  Method:
  547.  * CHXAudioDevice::OnTimeSync
  548.  * Purpose:
  549.  * Get the audio time from the platform specific function
  550.  * GetCurrentAudioTime() and pass this up to the audio
  551.  * session.
  552.  */
  553. HX_RESULT    CHXAudioDevice::OnTimeSync()
  554. {
  555.     HX_RESULT theErr = HXR_OK;
  556.     // Ignore this if we're paused!
  557.     if (!m_bPaused)
  558.     {
  559.         ULONG32 ulAudioTime = 0;
  560.         theErr = _Imp_GetCurrentTime( ulAudioTime );
  561.         if (m_pDeviceResponse)
  562.         {
  563.             theErr = m_pDeviceResponse->OnTimeSync(ulAudioTime);
  564.         }
  565.     }
  566.     return theErr;
  567. }
  568. UINT16 CHXAudioDevice::NumberOfBlocksRemainingToPlay()
  569. {
  570.     return _NumberOfBlocksRemainingToPlay();
  571. }
  572. BOOL CHXAudioDevice::IsWaveOutDevice()
  573. {
  574.     return _IsWaveOutDevice();
  575. }
  576. BOOL CHXAudioDevice::_IsWaveOutDevice()
  577. {
  578.     return TRUE;
  579. }
  580. /*************************************************************************
  581.  * Test code..
  582.  *
  583.  */ 
  584. #ifdef _TESTING_STR
  585. #include <stdio.h>
  586. #ifndef _WINDOWS
  587. #include <unistd.h>             // for getopt()
  588. #else
  589. #include <io.h> // for open()
  590. #define O_NONBLOCK  0
  591. #endif
  592. #include <stdlib.h>             // for atoi()
  593. #include <sys/types.h>          // for open()
  594. #include <sys/stat.h>           // for open()
  595. #include <fcntl.h>                      // for open()
  596. #define INITGUID 1
  597. #include "hxcom.h"
  598. #include "hxausvc.h"
  599. #include "hxaudev.h"
  600. int opt_debug = 0xff;
  601. int process_id(void)
  602. {
  603. return 10; 
  604. }
  605. #define BLOCK_SIZE  3176
  606. void main( int argc, char **argv )
  607. {
  608. CHXAudioDevice* mydev = 0;
  609. HX_RESULT theErr = HXR_OK;
  610. mydev = CHXAudioDevice::Create();
  611. printf("main: created: %xn", mydev);
  612. HXAudioFormat audioFmt;
  613. audioFmt.uChannels = 1;
  614. audioFmt.uBitsPerSample= 16;
  615. audioFmt.ulSamplesPerSec= 11025; //44100; // 22050;  //11025;
  616. audioFmt.uMaxBlockSize = BLOCK_SIZE;
  617. printf("main: Format:n");
  618. printf("main: Channels:         %dn", audioFmt.uChannels );
  619. printf("main: Bits Per Sample   %dn", audioFmt.uBitsPerSample);
  620. printf("main: SamplesPerSec     %dn", audioFmt.ulSamplesPerSec);
  621. printf("main: MaxBlockSize      %dn", audioFmt.uMaxBlockSize);
  622. printf("main: Check Format: err: %dn", theErr);
  623.         theErr = mydev->CheckFormat( &audioFmt );
  624. if ( !theErr )
  625. {
  626. IHXAudioDeviceResponse*        playerResponse = 0;
  627. theErr = mydev->Open( &audioFmt, playerResponse );
  628. }
  629. if ( !theErr )
  630. {
  631. theErr = mydev->Pause();
  632. theErr = mydev->Resume();
  633. }
  634. HXAudioData audioHdr;
  635. if ( !theErr )
  636. {
  637. audioHdr.ulAudioTime = 66;
  638. // Initialize the volume to 0,100
  639. if ( mydev->InitVolume( HX_MIN_VOLUME, HX_MAX_VOLUME ) )
  640. printf("main: SupportsVolume is TRUEn");
  641. else
  642. printf("main: SupportsVolume is FALSEn");
  643. UINT16 curVol = 0;
  644. theErr = mydev->GetVolume( curVol );
  645. printf("main: GetVolume: %dn", curVol);
  646. UINT16 newVol = HX_INIT_VOLUME;
  647. theErr = mydev->SetVolume( newVol );
  648. printf("main: SetVolume: %dn", newVol);
  649. curVol = 0;
  650. theErr = mydev->GetVolume( curVol );
  651. printf("main: GetVolume: %dn", curVol);
  652. }
  653. // Write some PCM to the device...
  654. if ( !theErr )
  655. {
  656. int cnt = 0;
  657. unsigned char buf[BLOCK_SIZE]; /* Flawfinder: ignore */
  658. if ( argc > 1 )
  659. {
  660. int fd;
  661. *argv++;
  662. printf("main: Playing: %s n", *argv);
  663. fd = open( *argv,O_RDONLY | O_NONBLOCK ); /* Flawfinder: ignore */
  664. if ( fd > 0 )
  665. {
  666. int nbytes = 0;
  667. audioHdr.pData = (UCHAR*) new char [BLOCK_SIZE ]; 
  668. while( (nbytes = read( fd, buf, BLOCK_SIZE)) > 0 ) /* Flawfinder: ignore */
  669. {
  670. memcpy(audioHdr.pData,buf, nbytes); /* Flawfinder: ignore */
  671. // play silence memset(audioHdr.pData, 0, nbytes);
  672. audioHdr.ulBufLen = nbytes;
  673.          theErr = mydev->Write( &audioHdr );
  674. cnt++;
  675. }
  676. }
  677. }
  678. printf("Played %d blocks of %d bytes = %dn", cnt, BLOCK_SIZE, cnt * BLOCK_SIZE);
  679. for (int i = 0; i<6; i++)
  680. {
  681. memset(buf,0,BLOCK_SIZE);
  682. memcpy(audioHdr.pData,buf, BLOCK_SIZE); /* Flawfinder: ignore */
  683. audioHdr.ulBufLen = BLOCK_SIZE;
  684.          theErr = mydev->Write( &audioHdr );
  685. }
  686. }
  687. if ( !theErr )
  688. theErr = mydev->Close(TRUE);
  689. }
  690. #endif // _TESTING