App Volume.cpp 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170
  1. /******************************************************************************/
  2. #include "stdafx.h"
  3. namespace EE{
  4. /******************************************************************************/
  5. #if WINDOWS_OLD
  6. static Bool tried, created;
  7. static HMIXER handle;
  8. static UInt ctrl_id_vol,
  9. ctrl_id_mute;
  10. #else
  11. #define MUTE_USER 0x1
  12. #define MUTE_EX 0x2
  13. static Flt Volume=1;
  14. static Byte Mute =0;
  15. static void SetMute() {SoundVolume.update();}
  16. #endif
  17. /******************************************************************************/
  18. AppVolumeClass AppVolume;
  19. /******************************************************************************/
  20. AppVolumeClass::AppVolumeClass() {}
  21. void AppVolumeClass::del()
  22. {
  23. #if WINDOWS_OLD
  24. if(tried)
  25. {
  26. mixerClose(handle);
  27. handle=null;
  28. }
  29. #endif
  30. }
  31. Bool AppVolumeClass::create()
  32. {
  33. #if WINDOWS_OLD
  34. if(tried)return created;
  35. tried=true;
  36. if(!mixerOpen(&handle, MIXER_OBJECTF_MIXER, 0, 0, 0))
  37. {
  38. MIXERLINE ml; Zero(ml);
  39. ml.cbStruct=SIZE(MIXERLINE);
  40. ml.dwComponentType=MIXERLINE_COMPONENTTYPE_DST_SPEAKERS;
  41. if(!mixerGetLineInfo((HMIXEROBJ)handle, &ml, MIXER_GETLINEINFOF_COMPONENTTYPE))
  42. {
  43. MIXERCONTROL mc ; Zero(mc );
  44. MIXERLINECONTROLS mlc; Zero(mlc);
  45. mlc.cbmxctrl=SIZE(MIXERCONTROL);
  46. mlc.cbStruct=SIZE(MIXERLINECONTROLS);
  47. mlc.dwLineID=ml.dwLineID;
  48. mlc.dwControlType=MIXERCONTROL_CONTROLTYPE_VOLUME;
  49. mlc.cControls=1;
  50. mlc.pamxctrl=&mc;
  51. if(!mixerGetLineControls((HMIXEROBJ)handle, &mlc, MIXER_GETLINECONTROLSF_ONEBYTYPE))
  52. {
  53. ctrl_id_vol=mc.dwControlID;
  54. Zero(mc );
  55. Zero(mlc);
  56. mlc.cbmxctrl=SIZE(MIXERCONTROL);
  57. mlc.cbStruct=SIZE(MIXERLINECONTROLS);
  58. mlc.dwLineID=ml.dwLineID;
  59. mlc.dwControlType=MIXERCONTROL_CONTROLTYPE_MUTE;
  60. mlc.cControls=1;
  61. mlc.pamxctrl=&mc;
  62. if(!mixerGetLineControls((HMIXEROBJ)handle, &mlc, MIXER_GETLINECONTROLSF_ONEBYTYPE))
  63. {
  64. ctrl_id_mute=mc.dwControlID;
  65. return created=true;
  66. }
  67. }
  68. }
  69. }
  70. return false;
  71. #else
  72. return true;
  73. #endif
  74. }
  75. /******************************************************************************/
  76. void AppVolumeClass::volume(Flt volume)
  77. {
  78. SAT(volume);
  79. #if WINDOWS_OLD
  80. if(create())
  81. {
  82. MIXERCONTROLDETAILS mcd ; Zero(mcd );
  83. MIXERCONTROLDETAILS_UNSIGNED mcdu; Zero(mcdu);
  84. mcd.cbStruct =SIZE(MIXERCONTROLDETAILS);
  85. mcd.cbDetails=SIZE(MIXERCONTROLDETAILS_UNSIGNED);
  86. mcd.dwControlID=ctrl_id_vol;
  87. mcd.paDetails=&mcdu;
  88. mcd.cChannels=1;
  89. mcdu.dwValue =RoundU(0xFFFF*volume);
  90. mixerSetControlDetails((HMIXEROBJ)handle, &mcd, MIXER_SETCONTROLDETAILSF_VALUE);
  91. }
  92. #else
  93. if(Volume!=volume)
  94. {
  95. Volume =volume;
  96. SoundVolume.update();
  97. }
  98. #endif
  99. }
  100. Flt AppVolumeClass::volume()
  101. {
  102. #if WINDOWS_OLD
  103. if(create())
  104. {
  105. MIXERCONTROLDETAILS mcd ; Zero(mcd );
  106. MIXERCONTROLDETAILS_UNSIGNED mcdu; Zero(mcdu);
  107. mcd.cbStruct =SIZE(MIXERCONTROLDETAILS);
  108. mcd.cbDetails=SIZE(MIXERCONTROLDETAILS_UNSIGNED);
  109. mcd.dwControlID=ctrl_id_vol;
  110. mcd.paDetails=&mcdu;
  111. mcd.cChannels=1;
  112. mixerGetControlDetails((HMIXEROBJ)handle, &mcd, MIXER_GETCONTROLDETAILSF_VALUE);
  113. return mcdu.dwValue/Flt(0xFFFF);
  114. }
  115. return 0;
  116. #else
  117. return Volume;
  118. #endif
  119. }
  120. /******************************************************************************/
  121. void AppVolumeClass::mute(Bool mute)
  122. {
  123. #if WINDOWS_OLD
  124. if(create())
  125. {
  126. MIXERCONTROLDETAILS mcd ; Zero(mcd );
  127. MIXERCONTROLDETAILS_BOOLEAN mcdb; Zero(mcdb);
  128. mcd.cbStruct =SIZE(MIXERCONTROLDETAILS);
  129. mcd.cbDetails=SIZE(MIXERCONTROLDETAILS_BOOLEAN);
  130. mcd.dwControlID=ctrl_id_mute;
  131. mcd.paDetails=&mcdb;
  132. mcd.cChannels=1;
  133. mcdb.fValue =mute;
  134. mixerSetControlDetails((HMIXEROBJ)handle, &mcd, MIXER_SETCONTROLDETAILSF_VALUE);
  135. }
  136. #else
  137. if(FlagTest(Mute, MUTE_USER)!=mute){Mute^=MUTE_USER; SetMute();}
  138. #endif
  139. }
  140. Bool AppVolumeClass::mute()
  141. {
  142. #if WINDOWS_OLD
  143. if(create())
  144. {
  145. MIXERCONTROLDETAILS mcd ; Zero(mcd );
  146. MIXERCONTROLDETAILS_BOOLEAN mcdb; Zero(mcdb);
  147. mcd.cbStruct =SIZE(MIXERCONTROLDETAILS);
  148. mcd.cbDetails=SIZE(MIXERCONTROLDETAILS_BOOLEAN);
  149. mcd.dwControlID=ctrl_id_mute;
  150. mcd.paDetails=&mcdb;
  151. mcd.cChannels=1;
  152. mixerGetControlDetails((HMIXEROBJ)handle, &mcd, MIXER_GETCONTROLDETAILSF_VALUE);
  153. return mcdb.fValue!=0;
  154. }
  155. return false;
  156. #else
  157. return FlagTest(Mute, MUTE_USER);
  158. #endif
  159. }
  160. #if !WINDOWS_OLD
  161. void AppVolumeClass::muteEx (Bool mute) {if(FlagTest(Mute, MUTE_EX)!=mute){Mute^=MUTE_EX; SetMute();}}
  162. Bool AppVolumeClass::muteEx ( )C {return FlagTest(Mute, MUTE_EX);}
  163. Bool AppVolumeClass::muteFinal( )C {return Mute!=0;}
  164. #endif
  165. /******************************************************************************/
  166. }
  167. /******************************************************************************/