hxaudev.cpp
上传用户:dangjiwu
上传日期:2013-07-19
资源大小:42019k
文件大小:19k
源码类别:

Symbian

开发平台:

Visual C++

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