fSoundAroundD.pas 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196
  1. unit fSoundAroundD;
  2. interface
  3. uses
  4. System.Classes,
  5. System.SysUtils,
  6. System.Math,
  7. Vcl.Forms,
  8. Vcl.ExtCtrls,
  9. Vcl.ComCtrls,
  10. Vcl.Controls,
  11. Vcl.StdCtrls,
  12. GLS.Scene,
  13. GLS.VectorTypes,
  14. GLS.Objects,
  15. GLS.Cadencer,
  16. GLS.VectorGeometry,
  17. GLS.SceneViewer,
  18. GLS.GeomObjects,
  19. GLS.SoundManager,
  20. Sounds.FMOD,
  21. Sounds.BASS,
  22. Sounds.OpenAL,
  23. Sounds.WaveOut,
  24. GLS.Coordinates,
  25. GLS.BaseClasses,
  26. GLS.FileWAV,
  27. GLS.FileMP3,
  28. GLS.Utils;
  29. type
  30. TFormSoundAround = class(TForm)
  31. GLScene: TGLScene;
  32. GLSceneViewer: TGLSceneViewer;
  33. GLCamera1: TGLCamera;
  34. DummyCube: TGLDummyCube;
  35. Sphere: TGLSphere;
  36. GLLightSource: TGLLightSource;
  37. GLSoundLibrary: TGLSoundLibrary;
  38. GLSMBASS: TGLSMBASS;
  39. GLSMFMOD: TGLSMFMOD;
  40. GLSMOpenAL: TGLSMOpenAL;
  41. GLCadencer1: TGLCadencer;
  42. Timer: TTimer;
  43. Mickey: TGLSphere;
  44. Sphere2: TGLSphere;
  45. Sphere3: TGLSphere;
  46. Cone1: TGLCone;
  47. TrackBar: TTrackBar;
  48. Plane1: TGLPlane;
  49. Disk1: TGLDisk;
  50. Torus1: TGLTorus;
  51. TrackBar1: TTrackBar;
  52. Panel1: TPanel;
  53. Label1: TLabel;
  54. RBBass: TRadioButton;
  55. RBFMOD: TRadioButton;
  56. Button1: TButton;
  57. btnHowl: TButton;
  58. RBOpenAL: TRadioButton;
  59. LabelFPS: TLabel;
  60. procedure SphereProgress(Sender: TObject; const deltaTime, newTime: Double);
  61. procedure TimerTimer(Sender: TObject);
  62. procedure TrackBarChange(Sender: TObject);
  63. procedure TrackBar1Change(Sender: TObject);
  64. procedure FormCreate(Sender: TObject);
  65. procedure RBFMODClick(Sender: TObject);
  66. procedure Button1Click(Sender: TObject);
  67. procedure btnHowlClick(Sender: TObject);
  68. private
  69. Path: TFileName;
  70. public
  71. end;
  72. var
  73. FormSoundAround: TFormSoundAround;
  74. implementation
  75. {$R *.DFM}
  76. procedure TFormSoundAround.FormCreate(Sender: TObject);
  77. begin
  78. Path := GetCurrentAssetPath();
  79. SetCurrentDir(Path + '\audio');
  80. // Load our sound samples
  81. GLSoundLibrary.Samples.AddFile('drumloop.wav', 'drumloop.wav');
  82. GLSoundLibrary.Samples.AddFile('chimes.wav', 'chimes.wav');
  83. GLSoundLibrary.Samples.AddFile('howl.mp3', 'howl.mp3');
  84. end;
  85. procedure TFormSoundAround.SphereProgress(Sender: TObject;
  86. const deltaTime, newTime: Double);
  87. var
  88. alpha: Single;
  89. begin
  90. // Move the red sphere (sound source) along an elliptic path
  91. alpha := 60 * DegToRad(newTime);
  92. TGLSphere(Sender).Position.SetPoint(sin(alpha) * 2, 0.5, cos(alpha) * 5);
  93. end;
  94. procedure TFormSoundAround.TrackBarChange(Sender: TObject);
  95. begin
  96. // Rotate the listener around the vertical axis
  97. DummyCube.TurnAngle := TrackBar.Position;
  98. Application.ProcessMessages;
  99. end;
  100. procedure TFormSoundAround.TrackBar1Change(Sender: TObject);
  101. begin
  102. // Move the listener forward/back
  103. Mickey.Position.Z := TrackBar1.Position / 10;
  104. Application.ProcessMessages;
  105. end;
  106. procedure TFormSoundAround.Button1Click(Sender: TObject);
  107. begin
  108. with TGLBSoundEmitter.Create(Sphere.Behaviours) do
  109. begin
  110. Source.SoundLibrary := GLSoundLibrary;
  111. Source.SoundName := 'chimes.wav';
  112. Playing := True;
  113. end;
  114. end;
  115. procedure TFormSoundAround.TimerTimer(Sender: TObject);
  116. var
  117. mngName: String;
  118. begin
  119. // some stats
  120. if ActiveSoundManager is TGLSMBASS then
  121. mngName := 'BASS'
  122. else if ActiveSoundManager is TGLSMFMOD then
  123. mngName := 'FMOD'
  124. else if ActiveSoundManager is TGLSMOpenAL then
  125. mngName := 'OpenAL'
  126. else
  127. mngName := '';
  128. if ActiveSoundManager <> nil then
  129. LabelFPS.Caption := Format('%.2f FPS, %s CPU use : %.2f%%',
  130. [GLSceneViewer.FramesPerSecond, mngName,
  131. ActiveSoundManager.CPUUsagePercent])
  132. else
  133. LabelFPS.Caption := 'No active sound manager.';
  134. GLSceneViewer.ResetPerformanceMonitor;
  135. end;
  136. procedure TFormSoundAround.RBFMODClick(Sender: TObject);
  137. var
  138. newManager: TGLSoundManager;
  139. begin
  140. // This method switches managers. On a real world project, this would never
  141. // happen: you would choose an API and then cling to it, but the GLSS
  142. // completely wraps the underlying complexity and makes it a snap
  143. if RBFMOD.Checked then
  144. begin
  145. newManager := GLSMFMOD;
  146. btnHowl.Enabled := true;
  147. end
  148. else if RBBass.Checked then
  149. begin
  150. newManager := GLSMBASS;
  151. btnHowl.Enabled := true;
  152. end
  153. else
  154. begin
  155. newManager := GLSMOpenAL;
  156. btnHowl.Enabled := false; // mp3 not supported
  157. end;
  158. if newManager <> ActiveSoundManager then
  159. begin
  160. // shut down current one, and activate the new one
  161. if ActiveSoundManager <> nil then
  162. ActiveSoundManager.Active := false;
  163. if newManager <> nil then
  164. newManager.Active := true;
  165. // restart sound
  166. GetOrCreateSoundEmitter(Sphere).Playing := true;
  167. end;
  168. end;
  169. procedure TFormSoundAround.btnHowlClick(Sender: TObject);
  170. begin
  171. with TGLBSoundEmitter.Create(Sphere.Behaviours) do
  172. begin
  173. Source.SoundLibrary := GLSoundLibrary;
  174. Source.SoundName := 'howl.mp3';
  175. Playing := True;
  176. end;
  177. end;
  178. end.