Форум программистов, компьютерный форум, киберфорум
Наши страницы
C++ Builder
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.96/27: Рейтинг темы: голосов - 27, средняя оценка - 4.96
Dmitrii_M
2 / 2 / 0
Регистрация: 11.09.2009
Сообщений: 29
#1

Громкость в TMediaPlayer

18.12.2009, 15:04. Просмотров 4941. Ответов 10
Метки нет (Все метки)

Требуется возможность изменения громкости при воспроизведении видео/музыки через этот компонент.
Возможно ли это реализовать через компонент, или нужно копать глубже(потоки,...)?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
18.12.2009, 15:04
Ответы с готовыми решениями:

Как у компонента TMediaPlayer изменить громкость?
Всем доброго времени суток) Я использую компонет TMediaPlayer через нево...

Проблема с TMediaPlayer
проблема в том что TMediaPlayer в с++ Builder 6 не может открыть видео при...

TMediaPlayer и Видео
Доброго времени суток.Поискал по всему Нэту ошибку с которой столкнулся при...

Посоветуйте аналоги TMediaPlayer
Если кто занимался программированием в этом направлением, может подскажет какой...

TMediaPlayer и многоканальный звук
может быть не совсем в тот раздел, но вопрос связан именно с TMediaPlayer ...

10
Nazz
WEB-developer
897 / 728 / 80
Регистрация: 12.03.2009
Сообщений: 2,802
Записей в блоге: 2
18.12.2009, 15:16 #2
Установить звук для TMediaPlayer

Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
uses
   MPlayer, MMSystem;
 
 const
   MCI_SETAUDIO = $0873;
   MCI_DGV_SETAUDIO_VOLUME = $4002;
   MCI_DGV_SETAUDIO_ITEM = $00800000;
   MCI_DGV_SETAUDIO_VALUE = $01000000;
   MCI_DGV_STATUS_VOLUME = $4019;
 
 type
   MCI_DGV_SETAUDIO_PARMS = record
     dwCallback: DWORD;
     dwItem: DWORD;
     dwValue: DWORD;
     dwOver: DWORD;
     lpstrAlgorithm: PChar;
     lpstrQuality: PChar;
   end;
 
 type
   MCI_STATUS_PARMS = record
     dwCallback: DWORD;
     dwReturn: DWORD;
     dwItem: DWORD;
     dwTrack: DWORD;
   end;
 
 procedure SetMPVolume(MP: TMediaPlayer; Volume: Integer);
   { Volume: 0 - 1000 }
 var
   p: MCI_DGV_SETAUDIO_PARMS;
 begin
   { Volume: 0 - 1000 }
   p.dwCallback := 0;
   p.dwItem := MCI_DGV_SETAUDIO_VOLUME;
   p.dwValue := Volume;
   p.dwOver := 0;
   p.lpstrAlgorithm := nil;
   p.lpstrQuality := nil;
   mciSendCommand(MP.DeviceID, MCI_SETAUDIO,
     MCI_DGV_SETAUDIO_VALUE or MCI_DGV_SETAUDIO_ITEM, Cardinal(@p));
 end;
 
 function GetMPVolume(MP: TMediaPlayer): Integer;
 var
    p: MCI_STATUS_PARMS;
 begin
   p.dwCallback := 0;
   p.dwItem := MCI_DGV_STATUS_VOLUME;
   mciSendCommand(MP.DeviceID, MCI_STATUS, MCI_STATUS_ITEM, Cardinal(@p));
   Result := p.dwReturn;
   { Volume: 0 - 1000 }
 end;
 
 // Example, Beispiel: 
 
procedure TForm1.Button1Click(Sender: TObject);
 begin
   SetMPVolume(MediaPlayer1, 500);
 end;

источник http://www.delphisources.ru/pages/faq/base/mp_set_volume.html

Данный пример уж очень расширен. Зато все очень выглядит красиво. Если
Вы хотите посмотреть на программу, которая хорошо применяет данный код,
то заходите в раздел сайта "Примеры" (www.DelphiXFiles.narod.ru/Samples.htm)
-----------------------------------------------------------------------

Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
unit svol;
 
interface
 
uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  ComCtrls, MMsystem, Buttons;
 
type
  TSetVol = class(TForm)
    VolBar: TProgressBar;
    SpeedButton1: TSpeedButton;
    SpeedButton2: TSpeedButton;
    procedure FormCreate(Sender: TObject);
    procedure VolBarMouseDown(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    procedure FormDestroy(Sender: TObject);
    procedure SpeedButton1Click(Sender: TObject);
    procedure SpeedButton2Click(Sender: TObject);
  private
    { Private declarations }
    procedure MixCtrlChange(var mess : TMessage); message MM_MIXM_CONTROL_CHANGE;
 
  public
    { Public declarations }
  end;
 
var
  SetVol: TSetVol;
  hmix:integer;
  mixcaps:TMixerCaps;
  volumeID,volmin,volmax:integer;
  details:TMixerControlDetails;
  mixctrl:TMixerControl;
  valdets:TMixerControlDetailsUnsigned;
  curvolume:dword;
  svEnable : boolean;
 
implementation
 
{$R *.DFM}
 
procedure TSetVol.MixCtrlChange(var mess : TMessage);
begin
  if not svEnable then exit;
  if SetVol.WindowState=wsMinimized then exit;
  details.cbStruct:=sizeof(details);
  details.dwControlID:=VolumeID;
  details.cChannels:=1;
  details.cMultipleItems:=0;
  details.cbDetails:=sizeof(valdets);
  details.paDetails:=@valdets;
  mixerGetControlDetails(hmix,@details,MIXER_GETCONTROLDETAILSF_VALUE);
  curvolume:=valdets.dwValue;
  SetVol.VolBar.Position:=curvolume;
end;
 
procedure TSetVol.FormCreate(Sender: TObject);
var
  i:integer;
  mixline:TMixerLine;
  mixlinectrl:TMixerLineControls;
  mixctrl:TMixerControl;
begin
  inherited;
  hVolForm:=Handle;
  Left:=80;
  Top:=TBHeight+2;
  mixerOpen(@hmix,0,Handle,0,MIXER_OBJECTF_MIXER or CALLBACK_WINDOW);
  mixerGetDevCaps(0,@mixcaps,sizeof(mixcaps))
  for i:=0 to mixcaps.cDestinations-1 do
   begin
     mixline.dwDestination:=i;
     mixline.cbStruct:=sizeof(mixline);
     mixerGetLineInfo(hmix,@mixline,MIXER_GETLINEINFOF_DESTINATION);
     if mixline.dwComponentType=MIXERLINE_COMPONENTTYPE_DST_SPEAKERS then
break;
   end;
  if mixline.dwComponentType<>MIXERLINE_COMPONENTTYPE_DST_SPEAKERSthen
   begin
     ShowMessage('Hет миксера!!!');
     svEnable:=False;
     exit;
   end
  else
    svEnable:=true;
  mixlinectrl.cbStruct:=sizeof(mixlinectrl);
  mixlinectrl.dwControlType:=MIXERCONTROL_CONTROLTYPE_VOLUME;
  mixlinectrl.dwLineID:=mixline.dwLineID;
  mixlinectrl.cControls:=2;
  mixlinectrl.cbmxctrl:=sizeof(mixctrl);
  mixctrl.dwControlType:=MIXERCONTROL_CONTROLTYPE_VOLUME;
  mixlinectrl.pamxctrl:=@mixctrl;
  mixerGetLineControls(hmix,@mixlinectrl,MIXER_GETLINECONTROLSF_ONEBYTYPE);
 
  VolumeID:=mixctrl.dwControlID;
  volmin:=mixctrl.Bounds.dwMinimum;
  volmax:=mixctrl.Bounds.dwMaximum;
 
  details.cbStruct:=sizeof(details);
  details.dwControlID:=VolumeID;
  details.cChannels:=1;
  details.cMultipleItems:=0;
  details.cbDetails:=sizeof(valdets);
  details.paDetails:=@valdets;
  mixerGetControlDetails(hmix,@details,MIXER_GETCONTROLDETAILSF_VALUE);
 
  curvolume:=valdets.dwValue;
  VolBar.Min:=volmin;
  VolBar.Max:=volmax;
  VolBar.Position:=curvolume;
end;
 
procedure TSetVol.VolBarMouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
  if not svEnable then exit;
  X:=Round(X/VolBar.Width*(VolBar.Max-VolBar.Min)+VolBar.Min);
  VolBar.Position:=X;
  details.cbStruct:=sizeof(details);
  details.dwControlID:=VolumeID;
  details.cChannels:=1;
  details.cMultipleItems:=0;
  details.cbDetails:=sizeof(valdets);
  details.paDetails:=@valdets;
  if X>4000 then
    valdets.dwValue:=VolBar.Position
  else
    valdets.dwValue:=0;
  mixerSetControlDetails(hmix,@details,MIXER_SETCONTROLDETAILSF_VALUE);
end;
 
procedure TSetVol.FormDestroy(Sender: TObject);
begin
  hVolForm:=0;
  if not svEnable then exit;
  mixerClose(hmix);
  inherited;
end;
 
procedure TSetVol.SpeedButton1Click(Sender: TObject);
begin
  if not svEnable then exit;
  VolBar.Position:=VolBar.Position-(VolBar.Max-VolBar.Min)div 10;
  if VolBar.Position<VolBar.Minthen VolBar.Position:=VolBar.Min;
  details.cbStruct:=sizeof(details);
  details.dwControlID:=VolumeID;
  details.cChannels:=1;
  details.cMultipleItems:=0;
  details.cbDetails:=sizeof(valdets);
  details.paDetails:=@valdets;
  if VolBar.Position>4000then
    valdets.dwValue:=VolBar.Position
  else
    valdets.dwValue:=0;
  mixerSetControlDetails(hmix,@details,MIXER_SETCONTROLDETAILSF_VALUE);
end;
 
procedure TSetVol.SpeedButton2Click(Sender: TObject);
begin
  if not svEnable then exit;
  VolBar.Position:=VolBar.Position+(VolBar.Max-VolBar.Min)div 10;
  if VolBar.Position>VolBar.Maxthen VolBar.Position:=VolBar.Max;
  details.cbStruct:=sizeof(details);
  details.dwControlID:=VolumeID;
  details.cChannels:=1;
  details.cMultipleItems:=0;
  details.cbDetails:=sizeof(valdets);
  details.paDetails:=@valdets;
  if VolBar.Position>4000then
    valdets.dwValue:=VolBar.Position
  else
    valdets.dwValue:=0;
  mixerSetControlDetails(hmix,@details,MIXER_SETCONTROLDETAILSF_VALUE);
end;
 
end.
1
Dmitrii_M
2 / 2 / 0
Регистрация: 11.09.2009
Сообщений: 29
19.12.2009, 08:19  [ТС] #3
Спасибо за исходник.
Я изучаю с++, а паскаль/делфи я не знаю.
Можно ли как-нибудь сообразить план действий, возможно с функциями и т.д.

P.S. И все же есть ли у кого-то исходник на с++?

Добавлено через 16 часов 52 минуты
Вот попробовал перевести этот код на с++.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
#include <mmsystem.h>
 
...
 
DWORD MCI_SETAUDIO = [COLOR="SeaGreen"]$[/COLOR]0873;
DWORD MCI_DGV_SETAUDIO_VOLUME = [COLOR="SeaGreen"]$[/COLOR]4002;
DWORD MCI_DGV_SETAUDIO_ITEM = [COLOR="SeaGreen"]$[/COLOR]00800000;
DWORD MCI_DGV_SETAUDIO_VALUE = [COLOR="SeaGreen"]$[/COLOR]01000000;
DWORD MCI_DGV_STATUS_VOLUME = [COLOR="SeaGreen"]$[/COLOR]4019;
 
class MCI_DGV_SETAUDIO_PARMS            //предположил, что type это класс
{
    DWORD dwCallback;                      
    DWORD dwItem;
    DWORD dwValue;
    DWORD dwOver;
    char* lpstrAlgorithm;                     
    char* lpstrQuality;
};
 
class MCI_STATUS_PARM
{
    DWORD dwCallback;
    DWORD dwReturn;
    DWORD dwItem;
    DWORD dwTrack;
};
 
 
 
void SetMPVolume(TMediaPlayer* MP , int Volume)     //установить звук
{
   MCI_DGV_SETAUDIO_PARMS p;
   p.dwCallback = 0;
   p.dwItem = MCI_DGV_SETAUDIO_VOLUME;
   p.dwValue = Volume;
   p.dwOver = 0;
   p.lpstrAlgorithm = NULL;
   p.lpstrQuality = NULL;
   mciSendCommand(MP->DeviceID, MCI_SETAUDIO,
   MCI_DGV_SETAUDIO_VALUE || MCI_DGV_SETAUDIO_ITEM, Cardinal(@p));
}
 
int GetMPVolume(TMediaPlayer* MP )              //узнать звук
{
 
 
MCI_STATUS_PARMS p;
p.dwCallback = 0;
p.dwItem = MCI_DGV_STATUS_VOLUME;
mciSendCommand(MP->DeviceID, MCI_STATUS, MCI_STATUS_ITEM, Cardinal(@p));
 
return p.dwReturn;
}
Немножко получилось, но не доконца:
1) Нужно разобраться с этим (я не знаю как перевести "$"):
C++
1
2
3
4
5
DWORD MCI_SETAUDIO = [COLOR="SeaGreen"]$[/COLOR]0873;
DWORD MCI_DGV_SETAUDIO_VOLUME = [COLOR="SeaGreen"]$[/COLOR]4002;
DWORD MCI_DGV_SETAUDIO_ITEM = [COLOR="SeaGreen"]$[/COLOR]00800000;
DWORD MCI_DGV_SETAUDIO_VALUE = [COLOR="SeaGreen"]$[/COLOR]01000000;
DWORD MCI_DGV_STATUS_VOLUME = [COLOR="SeaGreen"]$[/COLOR]4019;
2) В коде встречается функция Cardinal(), в параметре которой есть символ "@p".
Хотелось бы прояснить знания насчет этой функции и её аргумента.

3) На всякий случай еще раз проверить код, т.к. могут быть ошибки.
0
Qwerty_coder
29 / 29 / 6
Регистрация: 14.12.2009
Сообщений: 79
19.12.2009, 12:03 #4
А можно сделать и без использования компоненты TMediaPlayer.
Достаточно, к примеру, поместить на форму TTrackBar и описать ее:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
#include <vcl.h>
#pragma hdrstop
#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
 
union TVolume{
  unsigned long Volume;
  struct{
    Word Right;
    Word Left;
        };
             }volume;
 
.....
 
__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{
   waveOutGetVolume(0,&volume.Volume);
   TrackBar1->Position = 0xFFFF - volume.Right;
}
............
 
void __fastcall TForm1::TrackBar1Change(TObject *Sender)
{
    volume.Right = 0xFFFF - TrackBar1->Position;
    volume.Left = 0xFFFF - TrackBar1->Position;
    waveOutSetVolume(0,volume.Volume);
}
1
Nazz
WEB-developer
897 / 728 / 80
Регистрация: 12.03.2009
Сообщений: 2,802
Записей в блоге: 2
19.12.2009, 12:35 #5
код, вроди, написан , по логике, правильно... нужно компилировать... вот Вам неплохая инфа http://www.bestreferat.ru/referat-80490.html
Промотрите ещё вот http://www.fssr.ru/hz.php?name=News&file=article&sid=7984
1
Dmitrii_M
2 / 2 / 0
Регистрация: 11.09.2009
Сообщений: 29
20.12.2009, 04:48  [ТС] #6
Цитата Сообщение от Qwerty_coder Посмотреть сообщение
А можно сделать и без использования компоненты TMediaPlayer.
Достаточно, к примеру, поместить на форму TTrackBar и описать ее:
Спасибо, но мне надо именно в MediaPlayer.

код, вроди, написан , по логике, правильно... нужно компилировать... вот Вам неплохая инфа http://www.bestreferat.ru/referat-80490.html
Промотрите ещё вот http://www.fssr.ru/hz.php?name=News&...ticle&sid=7984
Спасибо, теперь ясно, что такое "Cardinal".

Сейчас во время компиляции ругается только на значки доллара, подскажите, как их перевести на c++.
C++
1
2
3
4
5
DWORD MCI_SETAUDIO =$0873;
DWORD MCI_DGV_SETAUDIO_VOLUME = $4002;
DWORD MCI_DGV_SETAUDIO_ITEM = $00800000;
DWORD MCI_DGV_SETAUDIO_VALUE = $01000000;
DWORD MCI_DGV_STATUS_VOLUME = $4019;
0
Drony
1 / 1 / 0
Регистрация: 22.10.2011
Сообщений: 18
29.10.2011, 10:02 #7
Покажите, плз, что получилось...
0
LK
Заблокирован
29.10.2011, 18:47 #8
C++
1
2
3
4
5
DWORD MCI_SETAUDIO = 0x0873;
DWORD MCI_DGV_SETAUDIO_VOLUME = 0x4002;
DWORD MCI_DGV_SETAUDIO_ITEM = 0x00800000;
DWORD MCI_DGV_SETAUDIO_VALUE = 0x01000000;
DWORD MCI_DGV_STATUS_VOLUME = 0x4019;
0
Drony
1 / 1 / 0
Регистрация: 22.10.2011
Сообщений: 18
29.10.2011, 19:21 #9
Спасибо, я уже придумал другой вариант…) но буду иметь в виду и этот)
0
LK
Заблокирован
29.10.2011, 19:50 #10
Drony, поделились бы "другим вариантом"
0
Drony
1 / 1 / 0
Регистрация: 22.10.2011
Сообщений: 18
29.10.2011, 19:58 #11
C++
1
waveOutSetVolume(0, MAKELONG(TrackBar1->Position, TrackBar1->Position));
1
29.10.2011, 19:58
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
29.10.2011, 19:58

Децибелометр для TMediaPlayer
Добрый вечер. Как сделать Децибелметр или как это назвать другими словами....

TMediaPlayer - не найдена программа распаковки
Пишу простейший видеопроигрыватель на TMediaPlayer. При попытке воспроизведения...

TMediaPlayer - не воспроизводит некоторые файлы.
Здравствуйте, TMediaPlayer - некоторые файлы воспроизводит, а некоторые - нет...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru