Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > Программа и интерфейс
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 26.08.2012, 00:43
Dmitry_DM Dmitry_DM вне форума
Активный
 
Регистрация: 07.08.2012
Сообщения: 258
Версия Delphi: Delphi 7
Репутация: 11
По умолчанию Оптимизация MediaPlayer

Вот я сделал свой MediaPlayer1. В нем есть несколько недочетов: изменение громкости - при начале воспроизведения громкость все равно 100 %, хотя шкала показывает 50%. Все стает нормально, если подвигать этот ползунок. Как это исправить? Второе: при открытии файла, имя его записывается в ListBox1, во-первых: при двойном клике файл открывается, проигрывается, при открытии нового файла, все-равно остается прошлый файл в ListBox1. При повторном открытии происходит непонятное с TrackBar1(полоса прогресса музыки) и 2(Изменение громкости). Эта непонятность станет вам видна, при тестировании exe ниже приложенного. А во-вторых: как можно реализовать удаление объекта из ListBox1 кнопкой del? Третье: при проигрывании Mp3 остаток времени показывает правильно, при проигрывании wav - пишет огромное кол. минут. Как это исправить. Вроде все, если найдете в exe еще ошибки при тестировании, прошу так же исправить. Вот код, касающийся только проигрывания:
Код:
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;

procedure TForm1.FormCreate(Sender: TObject);
begin
MediaPlayer1.Shareable:=False;

MediaPlayer1.AutoRewind:=True;

MediaPlayer1.Wait:=True;
end;



procedure TForm1.Button7Click(Sender: TObject);
begin
OpenDialog1.Options:=[ofAllowMultiSelect];
MediaPlayer1.FileName:=' ';

With OpenDialog1 do

Begin

If not Execute then Exit;

MediaPlayer1.FileName:=FileName;

MediaPlayer1.Open;

TrackBar1.Max:=MediaPlayer1.Length;

TrackBar1.Min:=MediaPlayer1.StartPos;

Timer1.Enabled:=True;

if ListBox1.Count>0 then
    begin
      mediaplayer1.FileName:=listbox1.Items.Strings[listbox1.itemindex];
      mediaplayer1.Open;
      TrackBar2.Max:=mediaplayer1.Length;
      Timer1.Enabled:=true;
      //***устанавливаем начальную громкость
      SetMPVolume(MediaPlayer1, 1000-TrackBar1.Position*50);
      mediaplayer1.Play;
    end
  else {ShowMessage('Playlist is empty');  }

  begin
    ListBox1.Clear;
    listbox1.Items.AddStrings(opendialog1.Files);
    //***автоматически выделяем первый файл в списке
    ListBox1.Selected[0]:=true;
    //***автоматически воспроизводим выделенный
    if CheckBox1.Checked then MediaPlayer1.Play;
  end;
  
end;
end;
procedure TForm1.ListBox1DblClick(Sender: TObject);
begin
Mediaplayer1.FileName:=listbox1.items.Strings[listbox1.itemindex];//добавляем строки
mediaplayer1.Open; //открываем
TrackBar1.Max:=mediaplayer1.Length;// приравниваеммаксимальную длину прогрессбара к текущей длине трэка
Timer1.Enabled:=true; //запускаем таймер для отсчёта времени
//***устанавливаем начальную громкость
SetMPVolume(MediaPlayer1, 1000-TrackBar1.Position*50);
mediaplayer1.Play; //воспроизводим
end;


procedure TForm1.Button8Click(Sender: TObject);
begin
With SaveDialog3 do
Begin
If not Execute then Exit;
MediaPlayer1.FileName:=FileName;
MediaPlayer1.Save;
end;
end;
procedure TForm1.Button9Click(Sender: TObject);
begin
MediaPlayer1.Close;
TrackBar2.Max:=TrackBar2.Min;
Application.Terminate;
end;

procedure TForm1.Timer1Timer(Sender: TObject);
Var
 Len,Pos,MinLeft,SecLeft,Min,Sec: Integer;
begin
 if TrackBar1.Max<>0 then
  begin
TrackBar1.Position:=MediaPlayer1.Position;
Len:=Mediaplayer1.TrackLength[ListBox1.ItemIndex];
//***вычесление времени
    Pos := Mediaplayer1.Position;
    MinLeft := ((Len - Pos) div 1000) div 60;//осталось мин
    SecLeft := ((Len - Pos) div 1000) mod 60;//осталось сек
    Min := (Pos div 1000) div 60;
    Sec := (Pos div 1000) mod 60;
//***осталось
    if SecLeft < 10 then
      label9.Caption := '0' + IntToStr(SecLeft)
    else
      label9.Caption := IntToStr(SecLeft);
    if MinLeft < 10 then
      label8.Caption := '0' + IntToStr(MinLeft)+':'
    else
      label8.Caption := IntToStr(MinLeft)+':';
//***прошло
    if Sec < 10 then
      label7.Caption := '0' + IntToStr(Sec)
    else
      label7.Caption := IntToStr(Sec);
    if Min < 10 then
      label6.Caption := '0' + IntToStr(Min)+':'
    else
      label6.Caption := IntToStr(Min)+':';

  end;
end;
//***изменение громкости
procedure TForm1.TrackBar2Change(Sender: TObject);
begin
  SetMPVolume(MediaPlayer1, 1000-TrackBar2.Position*50);
  Label5.Caption:=IntToStr(100-TrackBar2.Position*5)+'%';
end;

//***навигация по треку
procedure TForm1.TrackBar1MouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
var
  pos:integer;
begin
  pos:=round((100 / TrackBar1.Width)*x);//***позиция клика
  MediaPlayer1.Position:=(MediaPlayer1.Length div 100)*pos;
  MediaPlayer1.Play;
end;


procedure TForm1.Button10Click(Sender: TObject);
var
  chosenDir:string;
  f: tSearchRec;
begin
  //***вместо '' можно указать путь по умолчанию, напр. 'c:\music\'
  //***если оставить '' то будет предложен стандартный диалог выбора каталога
  if SelectDirectory('Выберите каталог','', chosenDir)
  then
    begin
      ListBox1.Clear;
      if (FindFirst(chosenDir+'\*.mp3', faAnyFile, f)=0) or
         (FindFirst(chosenDir+'\*.wma', faAnyFile, f)=0) or
         (FindFirst(chosenDir+'\*.wav', faAnyFile, f)=0)
      then
      repeat
        ListBox1.Items.Add(chosenDir+'\'+f.Name);
        FindNext(f);
        ListBox1.Items.Add(chosenDir+'\'+f.Name);
      until FindNext(f)<>0;
    if ListBox1.Items.Count<>0 then
      begin
        //***автоматически выделяем первый файл в списке
        ListBox1.Selected[0]:=true;
        //***автоматически воспроизводим выделенный
        if (CheckBox1.Checked) then MediaPlayer1.Play;
      end;
    end;
 end;
Буду благодарен за помощь! Отнеситесь с пониманием и протестируйте программу. Примеры wav прилагаю, mp3 возьмите свои.
Вложения
Тип файла: rar Media.rar (903.5 Кбайт, 35 просмотров)

Последний раз редактировалось Dmitry_DM, 26.08.2012 в 00:45.
Ответить с цитированием
  #2  
Старый 26.08.2012, 00:47
Аватар для angvelem
angvelem angvelem вне форума
.
 
Регистрация: 18.05.2011
Адрес: Омск
Сообщения: 3,970
Версия Delphi: 3,5,7,10,12,XE2
Репутация: выкл
По умолчанию

Самое правильное, выбрось MediaPlayer на помойку истории и используй bass.dll.
__________________
Je venus de nulle part
55.026263 с.ш., 73.397636 в.д.
Ответить с цитированием
  #3  
Старый 26.08.2012, 00:58
Dmitry_DM Dmitry_DM вне форума
Активный
 
Регистрация: 07.08.2012
Сообщения: 258
Версия Delphi: Delphi 7
Репутация: 11
По умолчанию

Цитата:
Сообщение от angvelem
Самое правильное, выбрось MediaPlayer на помойку истории и используй bass.dll.
Я уже думал об этом, но мне более нравится такой вид, тем более с новыми кнопками, сделанными по вашей помощи. К тому же программа полностью работает, но с этими недочётами. Просто просмотрите код и скажите где, что поправить. Иначе мне придется оставить как есть, так как эта функция в моем проекте не самая главная, но все же хочется, что бы было все нормально.
Ответить с цитированием
  #4  
Старый 26.08.2012, 01:05
Аватар для angvelem
angvelem angvelem вне форума
.
 
Регистрация: 18.05.2011
Адрес: Омск
Сообщения: 3,970
Версия Delphi: 3,5,7,10,12,XE2
Репутация: выкл
По умолчанию

Правильно думал, выбрось. Тем более при замене движка внешний вид программы не изменится, а плюсов будет гораздо больше. Вот набросок такого проигрывателя без излишеств.
Player

Ах да, требуется для работы Bass.dll.
__________________
Je venus de nulle part
55.026263 с.ш., 73.397636 в.д.
Ответить с цитированием
  #5  
Старый 26.08.2012, 01:13
Dmitry_DM Dmitry_DM вне форума
Активный
 
Регистрация: 07.08.2012
Сообщения: 258
Версия Delphi: Delphi 7
Репутация: 11
По умолчанию

Цитата:
Сообщение от angvelem
Правильно думал, выбрось. Тем более при замене движка внешний вид программы не изменится, а плюсов будет гораздо больше. Вот набросок такого проигрывателя без излишеств.
Player

Ах да, требуется для работы Bass.dll.
Ладно. Переделаю. Может лучше получится. Спасибо за совет. Хоть посмотрите программу, скажите как вам стиль.
Ответить с цитированием
  #6  
Старый 26.08.2012, 01:19
Аватар для angvelem
angvelem angvelem вне форума
.
 
Регистрация: 18.05.2011
Адрес: Омск
Сообщения: 3,970
Версия Delphi: 3,5,7,10,12,XE2
Репутация: выкл
По умолчанию

Я последний раз пользовался MediaPlayer-ом лет 10 назад, и у меня нет никакого желания к нему возвращаться. С Bass, при проблемах, помогу с удовольствием.
__________________
Je venus de nulle part
55.026263 с.ш., 73.397636 в.д.
Ответить с цитированием
  #7  
Старый 26.08.2012, 04:14
Аватар для poli-smen
poli-smen poli-smen вне форума
Профессионал
 
Регистрация: 06.08.2012
Адрес: Кривой Рог
Сообщения: 1,791
Версия Delphi: Delphi 7, XE2
Репутация: 4415
По умолчанию

Цитата:
Сообщение от Dmitry_DM
Ладно. Переделаю. Может лучше получится. Спасибо за совет. Хоть посмотрите программу, скажите как вам стиль.
Программу не запускал, а вот стиль исходника плохенький...
Форматирование хромает. Компоненты не переименованы (всякие там Button7, Label5, TrackBar2).

Почему в Button7Click дважды открывается MediaPlayer1?:
Код:
procedure TForm1.Button7Click(Sender: TObject);
begin
...
MediaPlayer1.FileName:=FileName;
MediaPlayer1.Open;
... 
      mediaplayer1.FileName:=listbox1.Items.Strings[listbox1.itemindex];
      mediaplayer1.Open;
...
И почему происходит такое присваивание?:
Код:
      TrackBar2.Max:=mediaplayer1.Length;
Ведь TrackBar2 вроде отвечает за громкость? А ему дают продолжительность... Не это ли твои непонятки с прыжками громкости?

Обработчик Timer1Timer вообще руки чешутся подсократить...

В Button10Click вижу FindFirst и FindNext, а где FindClose?

Цитата:
Сообщение от Dmitry_DM
во-первых: при двойном клике файл открывается, проигрывается, при открытии нового файла, все-равно остается прошлый файл в ListBox1
Конечно остаются прошлые файлы. А виной всему загадочная проверка при открытии файлов:
Код:
if ListBox1.Count>0 then
Если при открытии список пустой, то в него добавляются открываемые файлы, если же список уже заполнен, то открываемые файлы игнорируются и вместо них ставится на воспроизведение текущий выбранный в списке.

Ещё в двух местах у тебя есть такой код:
Код:
    //***автоматически выделяем первый файл в списке
    ListBox1.Selected[0]:=true;
    //***автоматически воспроизводим выделенный
    if CheckBox1.Checked then MediaPlayer1.Play;
А почему ты думаешь, что если выделить в списке первый элемент, то медиаплеер будет именно его воспроизводить?

И ещё объясни мне смысл вот этой строчки:
Код:
Len:=Mediaplayer1.TrackLength[ListBox1.ItemIndex];
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра
Комбинированный вид Комбинированный вид

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 12:46.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter