Вторник, 16.04.2024, 21:50
Приветствую Вас Гость

Не ошибается тот, кто ничего не делает.
Но и ничего не делать - ошибка.

Эмиль Кроткий

[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
  • Страница 1 из 1
  • 1
Форум » Delphi » Создание mp3 плеера на Delphi » Отображения уровня громкости динамиков
Отображения уровня громкости динамиков
ГромДата: Понедельник, 27.02.2012, 01:19 | Сообщение # 1
Рядовой
Группа: Пользователи
Сообщений: 2
Репутация: 0
Статус: Offline
Привет. Подскажи пожалуйста, как сделать отображение уровня грокости левого и правого динамиков на pointbox. Пытался разобраться с функцией BASS_ChannelGetAttribute, но у меня ничего не получилось. Если знаешь, то сделай пожалуйста пример с комментами или выложи код процедуры здесь. Заранее спасибо!

Сообщение отредактировал Гром - Вторник, 28.02.2012, 01:35
 
xaramamburuДата: Понедельник, 27.02.2012, 17:55 | Сообщение # 2
Полковник
Группа: Администраторы
Сообщений: 240
Репутация: 26
Статус: 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
Репутация: 0
Статус: 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
Репутация: 26
Статус: 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
Репутация: 2
Статус: Offline
xaramamburu
Здравствуйте smile
Это снова я.
У меня возникла проблемка при попытке заменить 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)
---------------------------------------------
И ещё вопрос smile
Для перетаскивания формы за любое место я использую этот код:

Code
procedure TForm_player.WMNCHITTEST(var Message: TMessage);
begin
   Message.Result:=HTCAPTION;
end;


Но минус в том, что при его использовании перестают срабатывать все image как кнопки...
Может вы знаете, как сделать так, что бы и перетаскивать форму можно было за любое место и оставались действующими image?
 
xaramamburuДата: Среда, 02.05.2012, 11:36 | Сообщение # 6
Полковник
Группа: Администраторы
Сообщений: 240
Репутация: 26
Статус: Offline
Filo$oF, это код не заменяет tracbar на image, а делает визуализацию громкости (два прыгающих столбика для правого и левого каналов). Если вы хотите сами нарисовать tracbar, то смотрите комментарии к четвертому уроку 14- и т.д. Про перетаскивание формы пока ничего сказать не могу.
 
MuLtLaNdIaДата: Понедельник, 14.05.2012, 22:14 | Сообщение # 7
Рядовой
Группа: Пользователи
Сообщений: 12
Репутация: 0
Статус: Offline
Я всё таки-таки так и не понял как же уровень громкости на правый и на левый канал повесить на TrackBar2 и в тоже время чтобы зависело от TrackBar1? help
По отдельности привязать на громкость и отдельно на баланс получается, а вот чтоб это вместе сделать не понимаю sad
 
xaramamburuДата: Среда, 16.05.2012, 21:46 | Сообщение # 8
Полковник
Группа: Администраторы
Сообщений: 240
Репутация: 26
Статус: 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;

smile
 
MuLtLaNdIaДата: Среда, 16.05.2012, 22:03 | Сообщение # 9
Рядовой
Группа: Пользователи
Сообщений: 12
Репутация: 0
Статус: Offline
xaramamburu
во... спасибо большое smile всё работает smile


Сообщение отредактировал MuLtLaNdIa - Среда, 16.05.2012, 22:10
 
Filo$oFДата: Четверг, 17.05.2012, 14:53 | Сообщение # 10
Лейтенант
Группа: Пользователи
Сообщений: 61
Репутация: 2
Статус: Offline
xaramamburu,

У меня вопросик. Как сделать, что бы image перемещался в место, где я щёлкнул мышью?

Объясню подробнее:
Я заменил trackbar на image1 и image2. То есть для регулирования громкости нужно двигать image2 по image1, а как сделать чтобы image2 перемещался в нужную позицию по щелчку на image1 ? Ну, как это реализовано во многих плеерах smile
Ну думаю понятно объяснил smile


Сообщение отредактировал Filo$oF - Четверг, 17.05.2012, 14:53
 
xaramamburuДата: Четверг, 17.05.2012, 20:30 | Сообщение # 11
Полковник
Группа: Администраторы
Сообщений: 240
Репутация: 26
Статус: 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
Репутация: 0
Статус: Offline
когда trackbar стоит на максимуме, столбики не прыгают, а когда ставишь на минимум, то прыгают. так и должно быть? если нет, то как это исправить?
Цитата xaramamburu ()
//а так можно связать с ползункои громкости


Сообщение отредактировал Vlad - Воскресенье, 09.03.2014, 00:07
 
xaramamburuДата: Воскресенье, 09.03.2014, 13:55 | Сообщение # 13
Полковник
Группа: Администраторы
Сообщений: 240
Репутация: 26
Статус: Offline
Vlad
Здесь все зависит от того как у вас работает trackbar? т.е. максимум громкости соответствует значению 0 или max trackbar. В первом случае нужно умножать на (trackbar1.Max - trackbar1.Position), а во втором случае на trackbar1.Position.))))
 
Форум » Delphi » Создание mp3 плеера на Delphi » Отображения уровня громкости динамиков
  • Страница 1 из 1
  • 1
Поиск:


Copyright MyCorp © 2024Конструктор сайтов - uCoz