Форум программистов, компьютерный форум, киберфорум
C++ Builder
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.90/30: Рейтинг темы: голосов - 30, средняя оценка - 4.90
Я Фоюмчанин ? дааааа)
 Аватар для ivan.-94
213 / 204 / 23
Регистрация: 02.06.2012
Сообщений: 1,424
Записей в блоге: 12

Как у компонента TMediaPlayer изменить громкость?

04.06.2012, 00:48. Показов 6632. Ответов 9
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всем доброго времени суток)
Я использую компонет TMediaPlayer через нево воспроизвожу музыку а через PlaySound звуки
но музыка звучит громко. Мне нужно уменшить звук у TMediaPlayer .
Как то зделать? у TMediaPlayer нету свойства volume (
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
04.06.2012, 00:48
Ответы с готовыми решениями:

Громкость в TMediaPlayer
Требуется возможность изменения громкости при воспроизведении видео/музыки через этот компонент. Возможно ли это реализовать через...

как изменить фон компонента image?
как изменить фон компонента image?

Как изменить способ задания свойств в Инспекторе для собственного компонента?
Есть компонент со свойствами типа bool или enum. Как сделать так, чтобы в инспекторе эти свойства задавались соответственно чекбоксом и...

9
 Аватар для cpp_developer
20124 / 5691 / 417
Регистрация: 09.04.2010
Сообщений: 22,546
Записей в блоге: 1
04.06.2012, 01:13
Ручками.
TrackBar и Timer
Громкость в TMediaPlayer
Использование MediaPlayer
Создание регулятора громкости для MediaPlayer
0
Я Фоюмчанин ? дааааа)
 Аватар для ivan.-94
213 / 204 / 23
Регистрация: 02.06.2012
Сообщений: 1,424
Записей в блоге: 12
04.06.2012, 02:15  [ТС]
Тут не то что мне нужно.
Мне не нужно регултровать громкость на компе, мне нужно как в любом проигрователе изменить громкость в самом проигрователе TMediaPlayer(
0
 Аватар для cpp_developer
20124 / 5691 / 417
Регистрация: 09.04.2010
Сообщений: 22,546
Записей в блоге: 1
04.06.2012, 02:36
Громкости в проигрывателе нет, громкость есть в системе. Ссылки все же стоило просмотреть.
0
Я Фоюмчанин ? дааааа)
 Аватар для ivan.-94
213 / 204 / 23
Регистрация: 02.06.2012
Сообщений: 1,424
Записей в блоге: 12
04.06.2012, 02:40  [ТС]
Цитата Сообщение от LK Посмотреть сообщение
Громкости в проигрывателе нет, громкость есть в системе. Ссылки все же стоило просмотреть.
я смотрел даже книгу почитал и скаччал себе.
Но там же было указано что громкость связыветься с заданой в системе.
тоесть я буду менять громкость в системе.
Или я неправильно понел?
0
 Аватар для cpp_developer
20124 / 5691 / 417
Регистрация: 09.04.2010
Сообщений: 22,546
Записей в блоге: 1
04.06.2012, 03:00
ivan.-94, да.

Вот похожее обсуждение с вражеского другого форума, кое-что можно почерпнуть.
Проиграть звук с заданной громкостью

Нужно проигрывать шум (он находится в звуковом файле), и на фоне шума проиграть другой звуковой файл (будет просто слово на фоне шума). Вот и все дела.

Громкость шума должна оставаться постоянной, а громкость слова должна меняться, т.е. проиграно слово с одной громкостью, потом громкость делаем чуть выше, опять проигрываем.

Используй два компонента из ActiveX - TMediaPlayer. В одном - шум, в другом - голос, там громкость можно изменять.

У меня в Билдере нет этого компонента на странице ActiveX, зато есть на странице System. И этот компонент не может изменять громкость.
Code
1
Component->Import ActiveX Control->Windows Media Player
Громкость нужно менять именно в программе, а не чтобы эту самую громкость менял пользователь. Windows Media Player AxtiveX я установил, но не нашел функции регулировки громкости. Подскажите, как же все-таки изменять громкость воспроизводимого файла в программе (файл воспроизводится с постоянной громкостью, мы ее меняем перед воспроизведением файла).

Остаётся только смикшировать шум и голос в один буфер или файл и выдать на звуковуху. Микширование - банальное арифметическое сложение, только стоит позаботиться, чтобы за диапазон не вылезло (берёшь просто амплитуды обоих звуков 0.5 от начальной). Результат можно записать в файл и потом проиграть через PlaySound (так проще), а проиграть буфер уже смотри функцию waveOutWrite (и всё, что к ней прилагается).

Нет, это не то, что надо. Нужно постоянно проигрывать шум с постоянной громкостью, и на фоне этого шума воспроизводить другой звук. Сначала с одним уровнем громкости, потом громкость увеличиваем и опять воспроизводим, потом еще раз увеличиваем громкость, опять воспроизводим и т.п.

Тогда так.

Загоняешь шум в один буфер, проигрываешь его waveOutWrite (буфер будет играться циклично, пока не выдашь команду waveOutBreakLoop).

А другой файл играешь из другого буфера тоже через waveOutWrite или через PlaySound (проще, потому как не надо городить функцию управления звуковым буфером, это потребуется), но громкость его придётся всё равно менять перед проигрыванием математически (уменьшать значения амплитуды).

Все функции установки громкости влияют на общую громкость воспроизведения звуковым ядром Windows, для отдельного звука громкость звука ты не выставишь таким образом
C++
1
MediaPlayer1->Valume = ProgressBar1->Possition or XXX;
Метод с медиаплеером весьма подходящ, если компонент такой есть. А я предлагаю просто стандартный метод, для которого нужен только WinAPI, но с ним надо посидеть-помучиться чуток, если с нуля начинать.

Ссылка на описание компонента TMediaPlayer.
http://program.rin.ru/razdel/html/1183.html

Кусок кода, который воcпроизводит шум из буфера бесконечно. Если хочешь, чтоб конечно, то whdr.dwLoops = количество повторов.
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
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
//---------------------------------------------------------------------------
#include <stdlib.h>
#include <stdio.h>
#include <conio.h>
#include <windows.h>
#include <mmreg.h>
#pragma hdrstop
//---------------------------------------------------------------------------
 
#pragma argsused
int main(int argc, char* argv[])
{
  HWAVEOUT hwo;
  WAVEFORMATEX wfmt;
 
  ZeroMemory(&wfmt, sizeof(wfmt));
 
  wfmt.wFormatTag = WAVE_FORMAT_PCM;
  wfmt.nChannels = 1;
  wfmt.nSamplesPerSec = 44100;
  wfmt.wBitsPerSample = 16;
  wfmt.nBlockAlign = wfmt.nChannels * wfmt.wBitsPerSample/8;
  wfmt.nAvgBytesPerSec = wfmt.nSamplesPerSec * wfmt.nBlockAlign;
  wfmt.cbSize = sizeof(wfmt);
 
  MMRESULT res = waveOutOpen(&hwo,
                             WAVE_MAPPER,
                             &wfmt,
                             0,
                             0,
                             CALLBACK_NULL);
 
  if(res == MMSYSERR_NOERROR) {
    printf("waveOutOpen() OK\n");
  };
 
  WAVEHDR whdr;
 
  ZeroMemory(&whdr, sizeof(whdr));
 
  unsigned short buf[44100]; //1 sec
 
  int buf_sz = 44100;
 
  //generiruem shum! psh-sh-sh-sh-sh-sh
  for(int i=0; i < buf_sz; i++) {
    buf[i] = rand();
  };
 
  whdr.lpData = (char *)buf;
  whdr.dwBufferLength = sizeof(buf);
 
  whdr.dwLoops = -1; //krutit' zvuk beskone4no!!!
 
  res = waveOutPrepareHeader(hwo, &whdr, sizeof(whdr));
  if(res == MMSYSERR_NOERROR) {
    printf("waveOutPrepareHeader() OK\n");
  };
 
  whdr.dwFlags |= WHDR_BEGINLOOP | WHDR_ENDLOOP;
 
  res = waveOutWrite(hwo, &whdr, sizeof(whdr));
  if(res == MMSYSERR_NOERROR) {
    printf("waveOutWrite() OK\n");
  };
 
  waveOutUnprepareHeader(hwo, &whdr, sizeof(whdr));
  waveOutClose(hwo);
 
  printf("finished.\n");
  getch();
  return 0;
}
Для воспроизведения файла таким же образом, его нужно загрузить функцией mmioOpen, либо тупо считать блок данных из wav файла со смещением на заголовок wav-файла. вроде бы 20 байт примерно, это в общем-то не критично.

Где в коде громкость?
C++
1
2
res = waveOutWrite(hwo, &whdr, sizeof(whdr));
if(res == MMSYSERR_NOERROR)
Громкость устанавливаешь предварительной обработкой буфера со звуком (умножаешь каждый сэмпл на нужное число меньше 1), да и вообще делаешь любую обработку. А чтобы явно задавать громкость воспроизведения фрагмента без вмешательства в информацию фрагмента, нужно, по-моему, в Direct Sound лезть уже.

Пример работает. И все же есть несколько вопросов.

1) все-таки как в буфер записать шум (может находиться в звуковом файле) и звук одновременно, причем шум воспроизводить всегда с постоянной громкостью, а громкость звука менять?
2) чтобы поменять громкость, как в прмере, нужно умножать сэмпл на число меньше 1. Сэмпл в коде является массив buf?

Задача, как я понял такова: крутить шум с постоянной громкостью бесконечно (или какое-то время), а на фоне него воспроизводить голос (другой звук) с нужной громкостью?

Если так, то варианта реализации два:

1) запускаем шум на бесконечное проигрывание, как в моём примере (шум можно загрузить из файла стандартным способом - открываешь файл, считываешь в буфер и всё, если нужно, то пример покажу), затем загружаешь голосовой файл в другой буфер, меняешь громкость в буфере (умножаешь на нужное число) и проигрываешь тем же способом, что и шум, но количество повторений ставишь 1.

2) сначала смешиваем шум и голос в нужной пропорции обыкновенным сложением буферов по формуле:
результат[i] = шум[i] * 0.5 + голос[i] * громкость, i по всей длине буфера голоса, потом резултат сложения воспроизводим.

waveOutSetVolume(0,0) вроде бы и устанавливает громкость в 0... потом
C++
1
veOutSetVolume(0, 0xCCCC)
вроде бы и срабатывает, но звук воспроизводится тихо-тихо
C++
1
2
HWAVEOUT hwo;
waveOutSetVolume(hwo, 0xFFFF);
Звук играет тихо.

waveOutSetVolume действует на устройство вывода звука в целом, поэтому воспроизведение будет происходить с той громкостью, которая установлена последней.
C++
1
2
3
4
5
void __fastcall TForm1::TrackBar1Change(TObject *Sender)
{
  waveOutSetVolume(0, MAKELONG(TrackBar1->Position, TrackBar1->Position));
}
TrackBar1->Max=65535;
Играется параллельно два звука - шум и синусоида с частотой 1 кГц, у синусоиды выставлена громкость 10% (переменная volume), для удобства скомпоновал проигрывание звука в функцию PlayBuffer();
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
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
//---------------------------------------------------------------------------
#include <stdlib.h>
#include <stdio.h>
#include <conio.h>
#include <windows.h>
#include <mmreg.h>
#include <math.h>
#pragma hdrstop
//---------------------------------------------------------------------------
 
int volume = 10; //gromkost' v procentah 0 - 100%
 
MMRESULT PlayBuffer(unsigned short *buf, int buf_sz, int loops)
{
  HWAVEOUT hwo;
  WAVEFORMATEX wfmt;
 
  ZeroMemory(&wfmt, sizeof(wfmt));
 
  wfmt.wFormatTag = WAVE_FORMAT_PCM;
  wfmt.nChannels = 1;
  wfmt.nSamplesPerSec = 44100;
  wfmt.wBitsPerSample = 16;
  wfmt.nBlockAlign = wfmt.nChannels * wfmt.wBitsPerSample / 8;
  wfmt.nAvgBytesPerSec = wfmt.nSamplesPerSec * wfmt.nBlockAlign;
  wfmt.cbSize = sizeof(wfmt);
 
  MMRESULT res = waveOutOpen(&hwo,
                             WAVE_MAPPER,
                             &wfmt,
                             0,
                             0,
                             CALLBACK_NULL);
 
  if(res == MMSYSERR_NOERROR) {
    printf("waveOutOpen() OK\n");
  }
  else
    return res;
 
  WAVEHDR whdr;
 
  ZeroMemory(&whdr, sizeof(whdr));
 
  whdr.lpData = (char *)buf;
  whdr.dwBufferLength = buf_sz;
  whdr.dwLoops = loops;
  res = waveOutPrepareHeader(hwo, &whdr, sizeof(whdr));
  if(res == MMSYSERR_NOERROR) {
    printf("waveOutPrepareHeader() OK\n");
  }
  else
   return res;
 
  whdr.dwFlags |= WHDR_BEGINLOOP | WHDR_ENDLOOP;
 
  res = waveOutWrite(hwo, &whdr, sizeof(whdr));
  if(res == MMSYSERR_NOERROR) {
    printf("waveOutWrite() OK\n");
  }
  return res;
  waveOutClose(hwo);
  return MMSYSERR_NOERROR;
};
 
 
#pragma argsused
int main(int argc, char* argv[])
{
  unsigned short buf[44100];
  unsigned short buf1[44100];
 
  int buf_sz = 44100;
 
  for(int i=0; i < buf_sz; i++) {
   buf[i] = rand();
   buf1[i] = 16384*sin(2*M_PI*1000.0*i/44100.0);
  };
 
  //igraem shum
  PlayBuffer(buf, buf_sz, -1);
 
  //umen'shaem gromkost' sinusoidy
  for(int i=0; i < buf_sz; i++)
    buf1[i] = buf1[i] / ((int)(100 / volume));
 
  //igraem sinusoidu na fone shuma
  PlayBuffer(buf1, buf_sz, -1);
 
  printf("finished.\n");
  getch();
  return 0;
}
Но waveOutSetVolume выставляет громкость в микшере на регулятор WAVE. Можешь открыть микшер и запустить свой пример и убедиться в этом, так что это не покатит.

Можно не использовать mmioOpen, если заведомо знаеть, в каком формате файл WAV (т.е. если он не сжат ничем, известны: частота дискретизации (44\22\11Кгц), кол-во бит на осчёт (8\16), стерео\моно).

Можно считать как обычный бинарный файл:
C++
1
2
3
4
5
6
7
8
9
10
#define WAV_HEADER_SIZE 20
int f_h = FileOpen("voice.wav", fmOpenRead);
int f_len = FileSeek(f_h, 0, 2);
FileSeek(f_h, WAV_HEADER_SIZE, 0);
   
char *buf = new char[f_len+1];
int bytes_read = FileRead(f_h, buf, f_len - WAV_HEADER_SIZE);
FileClose(f_h);
...
PlayBuffer(buf, bytes_read, -1);
Как заглушить звук, играемый функцией
C++
1
PlayBuffer(noise, bytes_read, -1);
Пробовал после вызова функции писать
C++
1
waveOutClose(hwo);
Но программа вылетает. Если еще раз вызвать эту функцию с последним параметром 1 или -1, программа вылетает.

waveOutClose(hwo) закрываеть дескриптор устройства, а не само устройство (эта функция вызывается в PlayBuffer). Чтоб заглушить звук - надо либо из программы выйти, либо waveOutBreakLoop(hwo), но тогда нужно не закрывать дескриптор, чтоб им можно было манипулировать.

Все равно вылетает программа, даже если не закрывать дескриптор устройства в функции PlayBuffer. И функцией WaveOutReset ничего не получается сделать.

В формуле микширования нужно аккуратно всё проделать с преобразованием типов.
Заметь, что в программе у меня не умножается на 0.1, а делится целочисленно на (int)(100/громкость). Громкость в данном случае в процентах. В формуле микширование громкость не должна быть больше 1, ибо это соответствует 100%.

А по поводу закрытия, hwo инициализируется в PlayBuffer, а работать с ним пытаеются наверняка в main, передавай его по указателю в параметрах PlayBuffer, тогда сможешь воспользоваться в любом месте. Вообще говоря, прогу нужно по структуре сложнее писать, с callback функциями состояния waveOut устройства и проч., чтоб правильно управлять хэндлами устройства. Тебе я для наглядности простой вариант написал, мне казалось, что его достаточно для твоих целей.

Не тут то было: если идут две функции подряд
C++
1
2
3
4
5
6
7
8
PlayBuffer(hwo, noise, bytes_read, -1);
PlayBuffer(hwo, buf, bytes_read, 1);
 
то ничто из этого:
 
waveOutBreakLoop(hwo);
waveOutReset(hwo);
waveOutClose(hwo);
не помогает.

Не так, как надо работает (int)(100/volume). Громкость меняется, но некорректно - звучание вообще фиговое становится. На синусоиде не слышно этого, но вот если ты файл будешь проигрывать - разницу вмиг ощутишь.

Для каждого вывода буффера свой хэндл-переменную организуй hwo1, hwo2 и т.д.

По поводу громкости, ты случаем c длинной выборки не лажанулся?. Если у тебя 16-битный звук, то и сэмпл у тебя там не char, а signed short, знак тоже важен! И оперировать ты должен обязательно с массивом 16-битных знаковых числел, а не с каким-либо другим. Вообще говоря, преобразования со звуком стоит производить в плавающей точке, а затем округлять перед проигрыванием.

При целочисленном делении в чистом виде у тебя имеют место ошибки счёта и при сильном уменьшении громкости весьма существенные.

Заработало. Я и раньше пробовал, но надо было закрывать поочередно hwo1 and hwo2. А я этого не делал.

Самое интересное то, что при трассировке не возникает ошибок с памятью, а при полноценной работе программы Билдер ругается.

Теперь вообще при любом обращении к PlayBuffer с последним параметром больше 0 Билдер ругается на память, а если параметр -1 то все в порядке.

Во-первых: ставишь компиляцию в релиз. Во-вторых: убираешь в одной функции две операции со звуком сразу. Там почти аппаратная проблема.

Признаю, с громкостью лажанулся - в проге забыл преобразовать выборки к signed short, поэтому ноль сигнала уехал в минус-максимум.
C++
1
2
3
4
signed short buf1[44100];
//umen'shaem gromkost' sinusoidy
for(int i=0; i < buf_sz; i++)
  buf1[i] = buf1[i] / ((int)(100 / volume));
А с вейвами пробовали работать? и функции по нескольку раз вызывать в цикле? То-то же.

С вейвами мы и так работаем (если ты заметил, то в примере есть их загрузка), а вызывать в цикле функции не требуется, так что зачем велосипед городить? Многие программы великолепно через WaveMapper работают, а вот как раз через Direct Sound начинаются траблы (бывает и множественные).
1
Я Фоюмчанин ? дааааа)
 Аватар для ivan.-94
213 / 204 / 23
Регистрация: 02.06.2012
Сообщений: 1,424
Записей в блоге: 12
04.06.2012, 03:08  [ТС]
Кажеться то что нужно. Ну буду розбираться.) Спасибо огромное.
0
0 / 0 / 0
Регистрация: 30.10.2012
Сообщений: 3
30.10.2012, 22:36
Ребят, помогите, пожалуйста, мне тоже ПРАВИЛЬНО добавить кнопку громкости и обработчик для нее...
До того, как я полезла в код готового проигрывателя, всё работало (ф-ия перемотки, все станд ф-ии и т д.) Вроде разобралась с вашими "выдержками", но вставила пару фрагментов в код, не могу разобраться, почему не работает(((
Помогите, пожалуйста...
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
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
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
#include <vcl.h>
#pragma hdrstop
 
#include "Unit1.h"
#define MINUTE(ms) ((ms/1000)/60)
#define SECOND(ms) ((ms/1000)%60)
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TFPlayer *FPlayer;
 
   union TVolume{
  unsigned long Volume;
  struct{
    Word Right;
    Word Left;
        };
             }volume;
 
 
int flag=1;
int fl=1;
int f=1;
int time_min;
int time_sec;
//---------------------------------------------------------------------------
__fastcall TFPlayer::TFPlayer(TComponent* Owner)
        : TForm(Owner)
{
   waveOutGetVolume(0,&volume.Volume);
   TrackBar2->Position = 0xFFFF - volume.Right;
}
 
 
void __fastcall TFPlayer::TrackBar2Change(TObject *Sender)
{
    volume.Right = 0xFFFF - TrackBar2->Position;
    volume.Left = 0xFFFF - TrackBar2->Position;
    waveOutSetVolume(0,volume.Volume);
}
 
 
//---------------------------------------------------------------------------
 
 
void __fastcall TFPlayer::Timer1Timer(TObject *Sender)
{
  Image1->Picture->LoadFromFile(FileListBox1->FileName);
  FileListBox1->ItemIndex=FileListBox1->ItemIndex+1;
}
//---------------------------------------------------------------------------
void __fastcall TFPlayer::ListBox1Click(TObject *Sender)
{
 ButNext->Enabled=true;
 ButPrev->Enabled=true;
 ButPlay->Enabled=true;
 ButPause->Enabled=true;
 ButStop->Enabled=true;
 ButSlideShow->Enabled=true;
}
//---------------------------------------------------------------------------
void __fastcall TFPlayer::Timer2Timer(TObject *Sender)
{
 
++ time_sec;)
Label5->Caption=time_sec;
 
if (Label5->Caption == 60)
{
time_sec=0; 
++time_min; 
Label4->Caption=time_min; 
}
 
MediaPlayer1->DisplayRect=Rect(0,0,310,250);
TrackBar1->Position=MediaPlayer1->Position;
int Track; 
int ms;
AnsiString st;
Track = MCI_TMSF_TRACK(FPlayer->MediaPlayer1->Position);
ms = FPlayer->MediaPlayer1->TrackLength[Track];
st = st + " "+ IntToStr(MINUTE(ms)); 
st = st + ":" + IntToStr(SECOND(ms));
 
FPlayer->Label3->Caption = st;
if (MediaPlayer1->Position>=MediaPlayer1->Length){
  ListBox1->ItemIndex+=1;
  time_min=0;
  time_sec=0;
 Label2->Caption=ExtractFileName(MediaPlayer1->FileName);
 
MediaPlayer1->FileName = ListBox1->Items->operator [](ListBox1->ItemIndex);
MediaPlayer1->Open();
MediaPlayer1->Play();
}
}
//---------------------------------------------------------------------------
void play(){
if (FPlayer->ListBox1->ItemIndex == -1) 
{
ShowMessage("Óêàæèòå ôàéë!"); 
}
else {
FPlayer->MediaPlayer1->FileName = FPlayer->ListBox1->Items->operator [](FPlayer->ListBox1->ItemIndex);
 FPlayer->Label2->Caption=ExtractFileName(FPlayer->MediaPlayer1->FileName);
 FPlayer->MediaPlayer1->Open();
 FPlayer->MediaPlayer1->Play();
 FPlayer->TrackBar1->Max=FPlayer->MediaPlayer1->Length;
 time_min=0;
 time_sec=0;
 FPlayer->Timer2->Enabled=true;
}
}
void __fastcall TFPlayer::TrackBar1Change(TObject *Sender)
{
if (TrackBar1->Position>MediaPlayer1->Position) {
  MediaPlayer1->Position=TrackBar1->Position;
  MediaPlayer1->Play();
}
 
}
//---------------------------------------------------------------------------
void __fastcall TFPlayer::BitBtn2Click(TObject *Sender)
{
ListBox1->Items->Delete(ListBox1->ItemIndex);
}
//---------------------------------------------------------------------------
 
void __fastcall TFPlayer::BitBtn3Click(TObject *Sender)
{
ListBox1->Items->Clear();        
}
//---------------------------------------------------------------------------
 
void __fastcall TFPlayer::BitBtn4Click(TObject *Sender)
{
if (SaveDialog1->Execute()) 
{
ListBox1->Items->SaveToFile(SaveDialog1->FileName); 
}        
}
//---------------------------------------------------------------------------
 
void __fastcall TFPlayer::BitBtn5Click(TObject *Sender)
{
ListBox1->Clear();
ListBox1->Items->LoadFromFile(FileListBox1->FileName);
 
}
//---------------------------------------------------------------------------
 
 
void __fastcall TFPlayer::ButPauseClick(TObject *Sender)
{
MediaPlayer1->Pause();
}
//---------------------------------------------------------------------------
 
void __fastcall TFPlayer::ButStopClick(TObject *Sender)
{
MediaPlayer1->Stop();        
}
//---------------------------------------------------------------------------
 
void __fastcall TFPlayer::ButPrevClick(TObject *Sender)
{
if (ListBox1->ItemIndex == -1) 
{
ListBox1->ItemIndex=0; 
play(); 
} else {
 
if (ListBox1->ItemIndex==0) 
{
ListBox1->ItemIndex=ListBox1->Count -1; 
play(); 
}
else
{
ListBox1->ItemIndex=ListBox1->ItemIndex -1; /
play(); 
}
}
}
//---------------------------------------------------------------------------
 
void __fastcall TFPlayer::ButNextClick(TObject *Sender)
{
if (ListBox1->ItemIndex >= ListBox1->Count-1) 
{
ListBox1->ItemIndex=0;
play();
}
else 
{
ListBox1->ItemIndex=ListBox1->ItemIndex+1; 
play(); 
}
}
//---------------------------------------------------------------------------
 
void __fastcall TFPlayer::ButSlideShowClick(TObject *Sender)
{
if (flag==1) {
  Timer1->Enabled=true;
  flag=0;
  DirectoryListBox1->Enabled=false;
  StatusBar1->Panels->operator [](0)->Text="Ðåæèì ïîêàçà ñëàéä-øîó âêëþ÷åí..";
}
else {
  flag=1;
  Timer1->Enabled=false;
  DirectoryListBox1->Enabled=true;
  StatusBar1->Panels->operator [](0)->Text="Ðåæèì ïîêàçà ñëàéä-øîó âûêëþ÷åí..";
}
}
//---------------------------------------------------------------------------
 
 
void __fastcall TFPlayer::FormCreate(TObject *Sender)
{
 Timer3->Enabled=true;
 FPlayer->Width=333;
 FPlayer->Height=372;
 ButNext->Enabled=false;
 ButPrev->Enabled=false;
 ButPlay->Enabled=false;
 ButPause->Enabled=false;
 ButStop->Enabled=false;
 ButSlideShow->Enabled=false;
}
//---------------------------------------------------------------------------
 
void __fastcall TFPlayer::ButOpenClick(TObject *Sender){
  if (fl==1){
    fl=0;
    FPlayer->Height=510;
    ListBox1->Height=360;
    Panel2->Top=393;
  }
  else {
    fl=1;
    FPlayer->Height=365;
    ListBox1->Height=236;
    Panel2->Top=262;
  }
}
//---------------------------------------------------------------------------
 
void __fastcall TFPlayer::Timer3Timer(TObject *Sender)
{
StatusBar1->Panels->operator [](1)->Text=Date();
StatusBar1->Panels->operator [](2)->Text=Time();
}
//---------------------------------------------------------------------------
 
 
void __fastcall TFPlayer::ButSlideShowMouseMove(TObject *Sender,
      TShiftState Shift, int X, int Y)
{
  StatusBar1->Panels->operator [](0)->Text=Application->Hint;
}
//---------------------------------------------------------------------------
 
void __fastcall TFPlayer::ListBox1DblClick(TObject *Sender)
{
int i=strlen(ListBox1->Items->operator [](ListBox1->ItemIndex).c_str())-3;
 int len=strlen(ListBox1->Items->operator [](ListBox1->ItemIndex).c_str());
 if (ListBox1->Items->operator [](ListBox1->ItemIndex).SubString(i,len)==".avi")
   Panel1->Visible=true;
 play();
}
//---------------------------------------------------------------------------
 
void __fastcall TFPlayer::FileListBox1DblClick(TObject *Sender)
{
  int i=strlen(FileListBox1->FileName.c_str())-3;
  int len=strlen(FileListBox1->FileName.c_str());
  if (FileListBox1->FileName.SubString(i,len)==".bmp" || FileListBox1->FileName.SubString(i,len)==".jpg"){
     Image1->Picture->LoadFromFile(FileListBox1->FileName);
     ButSlideShow->Enabled=true;
  }
  else {
     ButSlideShow->Enabled=false;
     ListBox1->Items->Add(FileListBox1->FileName);
  }          
}
//---------------------------------------------------------------------------
 
void __fastcall TFPlayer::BitBtn1Click(TObject *Sender)
{
if (f==1){
    f=0;
    FPlayer->Width=670;
    StatusBar1->Panels->operator [](0)->Width=540;
 
  }
  else {
    f=1;
    FPlayer->Width=330;
    StatusBar1->Panels->operator [](0)->Width=200;
    
  }
}
//---------------------------------------------------------------------------
 
void __fastcall TFPlayer::ButPlayClick(TObject *Sender)
{
play();
}
//---------------------------------------------------------------------------
 
void __fastcall TFPlayer::ButPrevMouseMove(TObject *Sender,
      TShiftState Shift, int X, int Y)
{
StatusBar1->Panels->operator [](0)->Text=Application->Hint;        
}
//---------------------------------------------------------------------------
 
void __fastcall TFPlayer::ButPlayMouseMove(TObject *Sender,
      TShiftState Shift, int X, int Y)
{
StatusBar1->Panels->operator [](0)->Text=Application->Hint;        
}
//---------------------------------------------------------------------------
 
void __fastcall TFPlayer::ButPauseMouseMove(TObject *Sender,
      TShiftState Shift, int X, int Y)
{
StatusBar1->Panels->operator [](0)->Text=Application->Hint;        
}
//---------------------------------------------------------------------------
 
void __fastcall TFPlayer::ButStopMouseMove(TObject *Sender,
      TShiftState Shift, int X, int Y)
{
StatusBar1->Panels->operator [](0)->Text=Application->Hint;        
}
//---------------------------------------------------------------------------
 
void __fastcall TFPlayer::ButNextMouseMove(TObject *Sender,
      TShiftState Shift, int X, int Y)
{
StatusBar1->Panels->operator [](0)->Text=Application->Hint;        
}
//---------------------------------------------------------------------------
 
void __fastcall TFPlayer::ButOpenMouseMove(TObject *Sender,
      TShiftState Shift, int X, int Y)
{
StatusBar1->Panels->operator [](0)->Text=Application->Hint;        
}
//---------------------------------------------------------------------------
 
void __fastcall TFPlayer::BitBtn1MouseMove(TObject *Sender,
      TShiftState Shift, int X, int Y)
{
StatusBar1->Panels->operator [](0)->Text=Application->Hint;        
}
//---------------------------------------------------------------------------
 
void __fastcall TFPlayer::BitBtn4MouseMove(TObject *Sender,
      TShiftState Shift, int X, int Y)
{
StatusBar1->Panels->operator [](0)->Text=Application->Hint;
}
//---------------------------------------------------------------------------
 
void __fastcall TFPlayer::BitBtn5MouseMove(TObject *Sender,
      TShiftState Shift, int X, int Y)
{
StatusBar1->Panels->operator [](0)->Text=Application->Hint;        
}
//---------------------------------------------------------------------------
 
void __fastcall TFPlayer::BitBtn3MouseMove(TObject *Sender,
      TShiftState Shift, int X, int Y)
{
StatusBar1->Panels->operator [](0)->Text=Application->Hint;        
}
//---------------------------------------------------------------------------
 
void __fastcall TFPlayer::BitBtn2MouseMove(TObject *Sender,
      TShiftState Shift, int X, int Y)
{
StatusBar1->Panels->operator [](0)->Text=Application->Hint;        
}
//---------------------------------------------------------------------------
 
void __fastcall TFPlayer::FormMouseMove(TObject *Sender, TShiftState Shift,
      int X, int Y)
{
if (flag==1) {
  StatusBar1->Panels->operator [](0)->Text="Ðåæèì ïîêàçà ñëàéä-øîó âûêëþ÷åí..";
}
else {
  StatusBar1->Panels->operator [](0)->Text="Ðåæèì ïîêàçà ñëàéä-øîó âêëþ÷åí..";
}
}
//---------------------------------------------------------------------------
 
void __fastcall TFPlayer::N3Click(TObject *Sender)
{
ListBox1->Items->Clear();         
}
//---------------------------------------------------------------------------
 
void __fastcall TFPlayer::N1Click(TObject *Sender)
{
ListBox1->Clear();
ListBox1->Items->LoadFromFile(FileListBox1->FileName);
}
//---------------------------------------------------------------------------
 
void __fastcall TFPlayer::N2Click(TObject *Sender)
{
if (SaveDialog1->Execute()) 
{
ListBox1->Items->SaveToFile(SaveDialog1->FileName); 
}
}
//---------------------------------------------------------------------------
 
 
До того, как я добавила описание:
 
union TVolume{
  unsigned long Volume;
  struct{
    Word Right;
    Word Left;
        };
             }volume;
 
и вот эти функции:
 
__fastcall TFPlayer::TFPlayer(TComponent* Owner)
        : TForm(Owner)
{
   waveOutGetVolume(0,&volume.Volume);
   TrackBar2->Position = 0xFFFF - volume.Right;
}
 
 
void __fastcall TFPlayer::TrackBar2Change(TObject *Sender)
{
    volume.Right = 0xFFFF - TrackBar2->Position;
    volume.Left = 0xFFFF - TrackBar2->Position;
    waveOutSetVolume(0,volume.Volume);
}
всё работало... Понимаю, что в последних двух ТОЧНО ошибка, какая - не знаю=(
может еще чего не хватает... Очень надеюсь на вашу помощь=)

Добавлено через 4 минуты
На вас очень надеюсь, посмотрите, пожалуйста, моё сообщение выше в теме=)
0
Практикантроп
 Аватар для nick42
4841 / 2726 / 534
Регистрация: 23.09.2011
Сообщений: 5,798
31.10.2012, 00:35
.. что это за функции: waveOutGetVolume() waveOutSetVolume() ? И я бы вот эту пару__
C++
1
2
3
4
5
6
__fastcall TFPlayer::TFPlayer(TComponent* Owner)
: TForm(Owner)
{
waveOutGetVolume(0,&volume.Volume);
TrackBar2->Position = 0xFFFF - volume.Right;
}
перенес в обработчик FormCreate (или FormShow).
0
0 / 0 / 0
Регистрация: 12.02.2012
Сообщений: 45
13.05.2016, 09:39
А вот такой вопрос. Юзаю компоненты mitov, громкость WAVов увеличивается отлично при помощи AMPLIFIERа, но я так мыслю он как раз банально умножает амплитуды частот и видимо именно поэтому при попытке увеличить громкость MP3 начинают появляться шумы и чем выше громкость тем больше звука теряется превращаясь в шипящие шумы. Соответственно, я так понимаю, и предложенным выше способом: читать в буфер и там ручками умножать громкость глухо. Как обойти проблему? И как тогда работает ну хотя бы родной WMP если в нём встроенный регулятор громкости не искажающий звук.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
13.05.2016, 09:39
Помогаю со студенческими работами здесь

Как зациклить проигрывание музыки(звуки) в TMediaPlayer
Что прописать или параметр какой выставить, чтобы объет TMediaPlayer после того как открыл файл и выполнил фун-ию Play() проигрывал файл...

Изменить стиль компонента ProgressBar
Нужно изменить стиль стандартного ProgressBar например на такой стиль как у винд7... Как это сделать...?? никогда раньше не работал со...

Не могу изменить цвет компонента CheckBox
Здравствуете! Меняю цвет: Label5 -&gt;Font-&gt;Color=clRed; - работает BitBtn1-&gt;Font-&gt;Color= clRed; - работает ...

Как изменить громкость звука?
Как отследить изменение уровня громкости динамиков и изменить его на C#?

как изменить системную громкость ?
Что-то очень мало информации про это пробовал двумя способами: 1. waveOutSetVolume(0,MAKELONG(LOWORD(00000),LOWORD(00000))); 2....


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

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Новые блоги и статьи
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip Сканируйте QR-код на мобильном и вы увидите, что появится джойстик для управления главным героем. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru