Отображения уровня громкости динамиков
|
|
Гром | Дата: Понедельник, 27.02.2012, 01:19 | Сообщение # 1 |
Рядовой
Группа: Пользователи
Сообщений: 2
Статус: Offline
| Привет. Подскажи пожалуйста, как сделать отображение уровня грокости левого и правого динамиков на pointbox. Пытался разобраться с функцией BASS_ChannelGetAttribute, но у меня ничего не получилось. Если знаешь, то сделай пожалуйста пример с комментами или выложи код процедуры здесь. Заранее спасибо!
Сообщение отредактировал Гром - Вторник, 28.02.2012, 01:35 |
|
| |
xaramamburu | Дата: Понедельник, 27.02.2012, 17:55 | Сообщение # 2 |
Полковник
Группа: Администраторы
Сообщений: 240
Статус: Offline
| Вот пример процедуры для отображения уровня громкости левого и правого каналов. Процедура вешается на таймер. На форме должны быть размещены два PaintBox.
procedure TForm_player.Timer2Timer(Sender: TObject); var left,right,l1,r1:integer; level:dword; begin //проверяем, если канал не активный, то выходим if BASS_ChannelIsActive(Channel)<>BASS_Active_Playing then exit; //получаем уровень сигнала level:=BASS_ChannelGetLevel(Channel); // уровень левого канала возвращен в низком слове (низкие 16 битов), //и уровень правого канала возвращен в высоком слове (высокие 16 битов). left:=LoWord(level); right:=HiWord(level); //заливаем PaintBox ы белым цветом PaintBox1.Canvas.Brush.Color:=clWhite; PaintBox1.Canvas.FillRect(PaintBox1.Canvas.ClipRect); PaintBox2.Canvas.Brush.Color:=clWhite; PaintBox2.Canvas.FillRect(PaintBox2.Canvas.ClipRect);
//вычисляем какая часть PaintBox будет закрашиваться, //в зависимости от уровня сигнала l1:=round(left/32768*PaintBox1.Height); r1:=round(right/32768*PaintBox2.Height);
//а так можно связать с ползункои громкости //l1:=round(left/32768/TrackBar1.Max*PaintBox1.Height*TrackBar1.Position); //r1:=round(right/32768/TrackBar1.Max*PaintBox2.Height*TrackBar1.Position);
//задаем черный цвет для рисования уровня сигнала PaintBox1.Canvas.Brush.Color:=clBlack; PaintBox2.Canvas.Brush.Color:=clBlack;
//рисуем PaintBox1.Canvas.Rectangle(0,PaintBox1.Height-l1,PaintBox1.Width,PaintBox1.Height); PaintBox2.Canvas.Rectangle(0,PaintBox2.Height-r1,PaintBox2.Width,PaintBox2.Height);
end;
|
|
| |
Гром | Дата: Вторник, 28.02.2012, 01:57 | Сообщение # 3 |
Рядовой
Группа: Пользователи
Сообщений: 2
Статус: Offline
| xaramamburu, огномное спасибо. Сегодня приду домой и попробую. Ты не против, если я ещё пару тем потом создам? У меня ещё несколько вопрос есть по Bass.dll Добавлено (28.02.2012, 01:57) --------------------------------------------- Большое спасибо, всё работает. Теперь я понял, как делить уровень звука на левый и правый дорожки
Code level:=BASS_ChannelGetLevel(Channel); // уровень левого канала возвращен в низком слове (низкие 16 битов), //и уровень правого канала возвращен в высоком слове (высокие 16 битов). left:=LoWord(level); right:=HiWord(level);
Но есть ещё один нюанс. У меня на форме лежит trackbar, который регулирует баланс между динамиками. Так вот, когда отдаешь предпочтение левому или правому динамику, то в индикаторах звука ничего не меняется. Можно ли как-то учитывать это?
И ещё, можно ли в индикаторах звука также учитывать регулировку звука через bass.dll?
|
|
| |
xaramamburu | Дата: Вторник, 13.03.2012, 22:33 | Сообщение # 4 |
Полковник
Группа: Администраторы
Сообщений: 240
Статус: Offline
| Дело в том, что left:=LoWord(level); right:=HiWord(level);, работают независимо от функции регулирования звука и баланса. И чтобы индикатор громкости реагировал на повышение или уменьшения громкости, эти уровни нужно привязать к нему, что я и пытался сделать : //а так можно связать с ползункои громкости l1:=round(left/32768/TrackBar1.Max*PaintBox1.Height*TrackBar1.Position); r1:=round(right/32768/TrackBar1.Max*PaintBox2.Height*TrackBar1.Position);
аналогично можно попробовать привязать и баланс.
Второй вопрос для меня не очень понятен, что значит учитывать регулировку звука через bass.dll?, а как сейчас вы регулируете звук?
|
|
| |
Filo$oF | Дата: Среда, 02.05.2012, 01:20 | Сообщение # 5 |
Лейтенант
Группа: Пользователи
Сообщений: 61
Статус: Offline
| xaramamburu Здравствуйте Это снова я. У меня возникла проблемка при попытке заменить tracbar на image. А именно в этих местах...
Code //а так можно связать с ползункои громкости l1:=round(left/32768/trackbar1.Max*PaintBox1.Height*trackbar1.Position); r1:=round(right/32768/trackbar1.Max*PaintBox2.Height*trackbar1.Position);
Code //сохраняем настройки в inifile //громкость звука IniFile.WriteInteger('Volue','trackbar1.position',trackbar1.position);
Code //установка громкости trackbar1.Min:=0; trackbar1.Max:=10; trackbar1.Position:=5;
Code //создание inifile с именем Config.ini //громкость звука trackbar1.position:=IniFile.ReadInteger('Volue','trackbar1.position',5);
Я так понимаю, нужно tracbar заменить на Image. Но вот как это сделать...Добавлено (01.05.2012, 23:21) --------------------------------------------- Если всё выше указанное удалить, то работает хорошо. Добавлено (02.05.2012, 01:20) --------------------------------------------- И ещё вопрос Для перетаскивания формы за любое место я использую этот код:
Code procedure TForm_player.WMNCHITTEST(var Message: TMessage); begin Message.Result:=HTCAPTION; end;
Но минус в том, что при его использовании перестают срабатывать все image как кнопки... Может вы знаете, как сделать так, что бы и перетаскивать форму можно было за любое место и оставались действующими image?
|
|
| |
xaramamburu | Дата: Среда, 02.05.2012, 11:36 | Сообщение # 6 |
Полковник
Группа: Администраторы
Сообщений: 240
Статус: Offline
| Filo$oF, это код не заменяет tracbar на image, а делает визуализацию громкости (два прыгающих столбика для правого и левого каналов). Если вы хотите сами нарисовать tracbar, то смотрите комментарии к четвертому уроку 14- и т.д. Про перетаскивание формы пока ничего сказать не могу.
|
|
| |
MuLtLaNdIa | Дата: Понедельник, 14.05.2012, 22:14 | Сообщение # 7 |
Рядовой
Группа: Пользователи
Сообщений: 12
Статус: Offline
| Я всё таки-таки так и не понял как же уровень громкости на правый и на левый канал повесить на TrackBar2 и в тоже время чтобы зависело от TrackBar1? По отдельности привязать на громкость и отдельно на баланс получается, а вот чтоб это вместе сделать не понимаю
|
|
| |
xaramamburu | Дата: Среда, 16.05.2012, 21:46 | Сообщение # 8 |
Полковник
Группа: Администраторы
Сообщений: 240
Статус: Offline
| MuLtLaNdIa, как то, так:
//а так можно связать с ползункои громкости и балансом if Trackbar2.Position=0 then begin l1:=round(left/32768/trackbar1.Max*PaintBox1.Height*trackbar1.Position); r1:=round(right/32768/trackbar1.Max*PaintBox2.Height*trackbar1.Position); end;
if Trackbar2.Position>0 then begin l1:=round(right/32768/trackbar1.Max/trackbar2.Max*PaintBox2.Height*trackbar1.Position*(trackbar2.Max-trackbar2.Position)); r1:=round(right/32768/trackbar1.Max*PaintBox2.Height*trackbar1.Position); end; if Trackbar2.Position<0 then begin l1:=round(left/32768/trackbar1.Max*PaintBox1.Height*trackbar1.Position); r1:=round(right/32768/trackbar1.Max/trackbar2.Max*PaintBox2.Height*trackbar1.Position*(trackbar2.Max+trackbar2.Position)); end;
|
|
| |
MuLtLaNdIa | Дата: Среда, 16.05.2012, 22:03 | Сообщение # 9 |
Рядовой
Группа: Пользователи
Сообщений: 12
Статус: Offline
| xaramamburu во... спасибо большое всё работает
Сообщение отредактировал MuLtLaNdIa - Среда, 16.05.2012, 22:10 |
|
| |
Filo$oF | Дата: Четверг, 17.05.2012, 14:53 | Сообщение # 10 |
Лейтенант
Группа: Пользователи
Сообщений: 61
Статус: Offline
| xaramamburu,
У меня вопросик. Как сделать, что бы image перемещался в место, где я щёлкнул мышью?
Объясню подробнее: Я заменил trackbar на image1 и image2. То есть для регулирования громкости нужно двигать image2 по image1, а как сделать чтобы image2 перемещался в нужную позицию по щелчку на image1 ? Ну, как это реализовано во многих плеерах Ну думаю понятно объяснил
Сообщение отредактировал Filo$oF - Четверг, 17.05.2012, 14:53 |
|
| |
xaramamburu | Дата: Четверг, 17.05.2012, 20:30 | Сообщение # 11 |
Полковник
Группа: Администраторы
Сообщений: 240
Статус: Offline
| Filo$oF,
procedure TForm1.Image1MouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); begin if X>Image1.Width-Image2.Width then Image2.Left:=Image1.Left+Image1.Width-Image2.Width else Image2.Left:=Image1.Left+X; end;
|
|
| |
Vlad | Дата: Воскресенье, 09.03.2014, 00:06 | Сообщение # 12 |
Лейтенант
Группа: Пользователи
Сообщений: 57
Статус: Offline
| когда trackbar стоит на максимуме, столбики не прыгают, а когда ставишь на минимум, то прыгают. так и должно быть? если нет, то как это исправить? Цитата xaramamburu ( ) //а так можно связать с ползункои громкости
Сообщение отредактировал Vlad - Воскресенье, 09.03.2014, 00:07 |
|
| |
xaramamburu | Дата: Воскресенье, 09.03.2014, 13:55 | Сообщение # 13 |
Полковник
Группа: Администраторы
Сообщений: 240
Статус: Offline
| Vlad, Здесь все зависит от того как у вас работает trackbar? т.е. максимум громкости соответствует значению 0 или max trackbar. В первом случае нужно умножать на (trackbar1.Max - trackbar1.Position), а во втором случае на trackbar1.Position.))))
|
|
| |
|