CSoundMixer.cpp
上传用户:snevogroup
上传日期:2008-06-06
资源大小:432k
文件大小:2k
源码类别:

Symbian

开发平台:

C/C++

  1. #include "CSoundMixer.h"
  2. #include "CMixerThread.h"
  3. #include <e32svr.h>
  4. CSoundMixer* CSoundMixer::NewL()
  5. {
  6. CSoundMixer* self = new( ELeave )CSoundMixer();
  7. CleanupStack::PushL( self );
  8. self->ConstructL();
  9. CleanupStack::Pop( self );
  10. return self;
  11. }
  12. void CSoundMixer::ConstructL()
  13. {
  14. iShared.iMainVolume = 64; // default main volume
  15. User::LeaveIfError( iMixerThread.Create( _L("Mixer"),
  16.  CMixerThread::ThreadFunction,
  17.  KDefaultStackSize,
  18.  NULL,
  19.  NULL) );
  20. // Give all possible priority to audio
  21. iMixerThread.SetPriority( EPriorityRealTime );
  22. RThread().SetPriority( EPriorityAbsoluteLow );
  23. User::LeaveIfError( iShared.iAliveMutex.CreateLocal( 1 ) );
  24. User::LeaveIfError( iShared.iMutex.CreateLocal() );
  25. iMixerThread.SetInitialParameter( &iShared );
  26. iMixerThread.Resume();
  27. iPaused = ETrue;
  28. }
  29. CSoundMixer::CSoundMixer()
  30. {
  31. }
  32. CSoundMixer::~CSoundMixer()
  33. {
  34. if( iPaused )
  35. SendCmd( ECmdStartMixer ); // maybe there's bug here
  36. SendCmd( ECmdDestroyMixer );
  37. //
  38. iShared.iAliveMutex.Wait();
  39. iShared.iAliveMutex.Close();
  40. iShared.iMutex.Close();
  41. }
  42. void CSoundMixer::Pause()
  43. {
  44. //RDebug::Print( _L("CSndMixer::Pause") );
  45. // check if mutex is already in wait ( pause mode )
  46. if( iPaused )
  47. {
  48. return;
  49. }
  50. iPaused = ETrue;
  51. SendCmd( ECmdStopMixer );
  52. }
  53. void CSoundMixer::Resume()
  54. {
  55. //RDebug::Print( _L("CSoundMixer::Resume") );
  56. if( !iPaused )
  57. {
  58. return;
  59. }
  60. iPaused = EFalse;
  61. SendCmd( ECmdStartMixer );
  62. }
  63. void CSoundMixer::Play( const TSample& aSample, TInt aChannel, TInt aFrequency, TInt aVolume )
  64. {
  65. iShared.iMutex.Wait();
  66. iShared.iPlayStarted[ aChannel ] = ETrue;
  67. iShared.iSample[ aChannel ] = aSample;
  68. iShared.iFrequency[ aChannel ] = aFrequency;
  69. iShared.iVolume[ aChannel ] = aVolume;
  70. iShared.iMutex.Signal();
  71. }
  72. void CSoundMixer::Stop( TInt aChannel )
  73. {
  74. iShared.iMutex.Wait();
  75. iShared.iPlayStarted[ aChannel ] = ETrue;
  76. iShared.iSample[ aChannel ] = iEmptySample;
  77. iShared.iMutex.Signal();
  78. }
  79. void CSoundMixer::SetVolume( TInt aVolume )
  80. {
  81. iShared.iMutex.Wait();
  82. iShared.iMainVolume = aVolume;
  83. iShared.iMutex.Signal();
  84. }
  85. TInt CSoundMixer::Volume()
  86. {
  87. return iShared.iMainVolume;
  88. }
  89. void CSoundMixer::SendCmd( TMixerCmd aCmd )
  90. {
  91. iShared.iMutex.Wait();
  92. iShared.iCmd = aCmd;
  93. iShared.iMutex.Signal();
  94. iMixerThread.RaiseException( EExcUserInterrupt );
  95. }