Экспертная система Delphi.int.ru

Сообщество программистов
Общение, помощь, обмен опытом

Логин:
Пароль:
Регистрация | Забыли пароль?

Delphi.int.ru Expert

Другие разделы портала

Переход к вопросу:

#   

Статистика за сегодня:  


Лучшие эксперты

Подробнее »



Вопрос # 1 973

/ вопрос открыт /

Доброго времени суток, уважаемые эксперты!
Делаю проигрыватель. Как настраивать звук прям в проигрывателе. И можно с пояснениями, а то мне надо будет потом объяснять принцип работы. Заранее спасибо.

Денис Вопрос ожидает решения (принимаются ответы, доступен мини-форум)

Вопрос задал: Денис (статус: Посетитель)
Вопрос отправлен: 6 октября 2008, 21:11
Состояние вопроса: открыт, ответов: 1.

Ответ #1. Отвечает эксперт: Feniks

Здравствуйте, Денис!
Держите в приложении три примера по управлению громкостью.

Приложение:
  1.  
  2. uses MMSystem;
  3.  
  4. procedure TForm1.Button1Click(Sender: TObject);
  5. var
  6. vol: longint;
  7. LVol, RVol: integer;
  8. begin
  9. AuxGetVolume(ListBox1.ItemIndex, @Vol);
  10. LVol := Vol shr 16;
  11. if LVol < MaxWord - 1000 then
  12. LVol := LVol + 1000
  13. else
  14. LVol := MaxWord;
  15. RVol := (Vol shl 16) shr 16;
  16. if RVol < MaxWord - 1000 then
  17. RVol := RVol + 1000
  18. else
  19. RVol := MaxWord;
  20. AuxSetVolume(ListBox1.ItemIndex, LVol shl 16 + RVol);
  21. end;
  22.  
  23. procedure TForm1.FormCreate(Sender: TObject);
  24. var
  25. i: integer;
  26. cap: TAuxCaps;
  27. begin
  28. for i := 0 to auxGetNumDevs - 1 do
  29. begin
  30. auxGetDevCaps(i, Addr(cap), SizeOf(cap));
  31. ListBox1.Items.Add(cap.szPname)
  32. end;
  33. end;
  34.  
  35.  
  36. procedure SetVolume(X: Word);
  37. var
  38. iErr: Integer;
  39. i: integer;
  40. a: TAuxCaps;
  41. begin
  42. for i := 0 to auxGetNumDevs do
  43. begin
  44. auxGetDevCaps(i, Addr(a), SizeOf(a));
  45. if a.wTechnology = AUXCAPS_CDAUDIO then
  46. break;
  47. end;
  48.  
  49.  
  50. // VOLUME := LEFT*$10000 + RIGHT*1
  51.  
  52. iErr := auxSetVolume(i, (X * $10001));
  53.  
  54. ShowMessage('No audio devices are available!');
  55. end;
  56.  
  57. function GetVolume: Word;
  58. var
  59. iErr: Integer;
  60. i: integer;
  61. a: TAuxCaps;
  62. vol: word;
  63. begin
  64. for i := 0 to auxGetNumDevs do
  65. begin
  66. auxGetDevCaps(i, Addr(a), SizeOf(a));
  67. if a.wTechnology = AUXCAPS_CDAUDIO then
  68. break;
  69. end;
  70. iErr := auxGetVolume(i, addr(vol));
  71. GetVolume := vol;
  72.  
  73. ShowMessage('No audio devices are available!');
  74. end;
  75.  
  76.  
  77. unit Volumes;
  78.  
  79. interface
  80.  
  81. uses
  82. Windows, Messages, Classes, ExtCtrls, ComCtrls, MMSystem;
  83.  
  84. const
  85. CDVolume = 0;
  86. WaveVolume = 1;
  87. MidiVolume = 2;
  88.  
  89. type
  90. TVolumeControl = class(TComponent)
  91. private
  92. FDevices : array[0..2] of Integer;
  93. FTrackBars : array[0..2] of TTrackBar;
  94. FTimer : TTimer;
  95. function GetInterval: Integer;
  96. procedure SetInterval(AInterval: Integer);
  97. function GetVolume(AIndex: Integer): Byte;
  98. procedure SetVolume(AIndex: Integer; aVolume: Byte);
  99. procedure InitVolume;
  100. procedure SetTrackBar(AIndex: Integer; ATrackBar: TTrackBar);
  101. { Private declarations }
  102. procedure Update(Sender: TObject);
  103. procedure Changed(Sender: TObject);
  104. protected
  105. { Protected declarations }
  106. procedure Notification(AComponent: TComponent; AOperation:
  107. TOperation); override;
  108. public
  109. { Public declarations }
  110. constructor Create(AOwner: TComponent); override;
  111. destructor Destroy; override;
  112. published
  113. { Published declarations }
  114. property Interval: Integer read GetInterval write SetInterval default
  115. 500;
  116. property CDVolume: Byte index 0 read GetVolume write SetVolume stored
  117. False;
  118. property CDTrackBar: TTrackBar index 0 read FTrackBars[0] write
  119. SetTrackBar;
  120. property WaveVolume: Byte index 1 read GetVolume write SetVolume
  121. stored False;
  122. property WaveTrackBar: TTrackBar index 1 read FTrackBars[1] write
  123. SetTrackBar;
  124. property MidiVolume: Byte index 2 read GetVolume write SetVolume
  125. stored False;
  126. property MidiTrackBar: TTrackBar index 2 read FTrackBars[2] write
  127. SetTrackBar;
  128. end;
  129.  
  130. procedure Register;
  131.  
  132. implementation
  133.  
  134. procedure Register;
  135. begin
  136. RegisterComponents('Any', [TVolumeControl]);
  137. end;
  138.  
  139. type
  140. TVolumeRec = record
  141. case Integer of
  142. 0: (LongVolume: Longint);
  143. 1: (LeftVolume,
  144. RightVolume : Word);
  145. end;
  146.  
  147. function TVolumeControl.GetInterval: Integer;
  148. begin
  149. Result := FTimer.Interval;
  150. end;
  151.  
  152. procedure TVolumeControl.SetInterval(AInterval: Integer);
  153. begin
  154. FTimer.Interval := AInterval;
  155. end;
  156.  
  157. function TVolumeControl.GetVolume(AIndex: Integer): Byte;
  158. var Vol: TVolumeRec;
  159. begin
  160. Vol.LongVolume := 0;
  161. if FDevices[AIndex] < > -1 then
  162. case AIndex of
  163. 0: auxGetVolume(FDevices[AIndex], @Vol.LongVolume);
  164. 1: waveOutGetVolume(FDevices[AIndex], @Vol.LongVolume);
  165. 2: midiOutGetVolume(FDevices[AIndex], @Vol.LongVolume);
  166. end;
  167. Result := (Vol.LeftVolume + Vol.RightVolume) shr 9;
  168. end;
  169.  
  170. procedure TVolumeControl.SetVolume(aIndex: Integer; aVolume: Byte);
  171. var Vol: TVolumeRec;
  172. begin
  173. if FDevices[AIndex] < > -1 then
  174. begin
  175. Vol.LeftVolume := aVolume shl 8;
  176. Vol.RightVolume := Vol.LeftVolume;
  177. case AIndex of
  178. 0: auxSetVolume(FDevices[AIndex], Vol.LongVolume);
  179. 1: waveOutSetVolume(FDevices[AIndex], Vol.LongVolume);
  180. 2: midiOutSetVolume(FDevices[AIndex], Vol.LongVolume);
  181. end;
  182. end;
  183. end;
  184.  
  185. procedure TVolumeControl.SetTrackBar(AIndex: Integer; ATrackBar:
  186. TTrackBar);
  187. begin
  188. if ATrackBar < > FTrackBars[AIndex] then
  189. begin
  190. FTrackBars[AIndex] := ATrackBar;
  191. Update(Self);
  192. end;
  193. end;
  194.  
  195. AOperation: TOperation);
  196. var I: Integer;
  197. begin
  198. inherited Notification(AComponent, AOperation);
  199. if (AOperation = opRemove) then
  200. for I := 0 to 2 do if (AComponent = FTrackBars[I])
  201. then FTrackBars[I] := Nil;
  202. end;
  203.  
  204. procedure TVolumeControl.Update(Sender: TObject);
  205. var I: Integer;
  206. begin
  207. for I := 0 to 2 do
  208. if Assigned(FTrackBars[I]) then
  209. with FTrackBars[I] do
  210. begin
  211. Min := 0;
  212. Max := 255;
  213. if Orientation = trVertical
  214. then Position := 255 - GetVolume(I)
  215. else Position := GetVolume(I);
  216. OnChange := Self.Changed;
  217. end;
  218. end;
  219.  
  220. constructor TVolumeControl.Create(AOwner: TComponent);
  221. begin
  222. inherited Create(AOwner);
  223. FTimer := TTimer.Create(Self);
  224. FTimer.OnTimer := Update;
  225. FTimer.Interval := 500;
  226. InitVolume;
  227. end;
  228.  
  229. destructor TVolumeControl.Destroy;
  230. var I: Integer;
  231. begin
  232. FTimer.Free;
  233. for I := 0 to 2 do
  234. if Assigned(FTrackBars[I]) then
  235. FTrackBars[I].OnChange := Nil;
  236. inherited Destroy;
  237. end;
  238.  
  239. procedure TVolumeControl.Changed(Sender: TObject);
  240. var I: Integer;
  241. begin
  242. for I := 0 to 2 do
  243. if Sender = FTrackBars[I] then
  244. with FTrackBars[I] do
  245. begin
  246. if Orientation = trVertical
  247. then SetVolume(I, 255 - Position)
  248. else SetVolume(I, Position);
  249. end;
  250. end;
  251.  
  252. procedure TVolumeControl.InitVolume;
  253. var AuxCaps : TAuxCaps;
  254. WaveOutCaps : TWaveOutCaps;
  255. MidiOutCaps : TMidiOutCaps;
  256. I,J : Integer;
  257. begin
  258. FDevices[0] := -1;
  259. for I := 0 to auxGetNumDevs - 1 do
  260. begin
  261. auxGetDevCaps(I, @AuxCaps, SizeOf(AuxCaps));
  262. if (AuxCaps.dwSupport and AUXCAPS_VOLUME) < > 0 then
  263. begin
  264. FTimer.Enabled := True;
  265. FDevices[0] := I;
  266. break;
  267. end;
  268. end;
  269. FDevices[1] := -1;
  270. for I := 0 to waveOutGetNumDevs - 1 do
  271. begin
  272. waveOutGetDevCaps(I, @WaveOutCaps, SizeOf(WaveOutCaps));
  273. if (WaveOutCaps.dwSupport and WAVECAPS_VOLUME) < > 0 then
  274. begin
  275. FTimer.Enabled := True;
  276. FDevices[1] := I;
  277. break;
  278. end;
  279. end;
  280. FDevices[2] := -1;
  281. for I := 0 to midiOutGetNumDevs - 1 do
  282. begin
  283. MidiOutGetDevCaps(I, @MidiOutCaps, SizeOf(MidiOutCaps));
  284. if (MidiOutCaps.dwSupport and MIDICAPS_VOLUME) < > 0 then
  285. begin
  286. FTimer.Enabled := True;
  287. FDevices[2] := I;
  288. break;
  289. end;
  290. end;
  291. end;
  292.  
  293. end.


Ответ отправил: Feniks (статус: Бакалавр)
Время отправки: 7 октября 2008, 10:24


Мини-форум вопроса

Мини-форум пуст.

Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.

Версия движка: 2.6+ (26.01.2011)
Текущее время: 22 февраля 2025, 11:29
Выполнено за 0.02 сек.