Форум программистов, компьютерный форум, киберфорум
Delphi для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.83/6: Рейтинг темы: голосов - 6, средняя оценка - 4.83
12 / 12 / 6
Регистрация: 15.08.2011
Сообщений: 184
1

Пишу компонент для упрощенной работы с библиотекой BASS

03.02.2017, 10:06. Показов 1104. Ответов 2
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Народ, пишу компонент, все прекрасно работает, но беда с событиями в компоненте, а именно:
Событие на проигрывание (хочу чтобы срабатывало либо каждую секунду либо циклично пока идет воспроизведение)
Событие на завершение проигрывания

В общем дело так:

Первое событие получилось реализовать только при помощи while (while currentpos <> length) тогда работает и событие завершения тоже работает но этот метод грузит проц на 50-60%

код компонента
Кликните здесь для просмотра всего текста
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
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
unit BassComp;
 
interface
 
  uses
    System.SysUtils, System.Classes, System.SysConst, System.Types,
    Dynamic_Bass;
 
  type
 
    TEventInitProc = procedure(Sender: TObject; Initialized: Boolean) of object;
    TEventPlayingProc = procedure(Sender: TObject; Position: Int64) of object;
    TEventDonePlayingProc = procedure(Sedner: TObject) of object;
    TEventDoneDownload = procedure(Sender: TObject; Downloaded: Boolean)
      of object;
 
    TBass = class(TComponent)
      private
        FLibrary: string;
        FInitialized: Boolean;
        // Track
        FLength: Int64;
        FPosition: Int64;
        FLoop: Boolean;
        // Stream
        FStream: HSTREAM;
        // Volume, Mute and etc.
        FVolume: Single;
        FMute: Boolean;
        FReservedVolume: Single;
        // Event Procedures
        FOnInitialized: TEventInitProc;
        FOnPlaying: TEventPlayingProc;
        FOnDonePlaying: TEventDonePlayingProc;
        FOnStreamDownloaded: TEventDoneDownload;
        procedure DoInitialized(Sender: TObject; Initialized: Boolean);
        procedure DoPlaying(Sender: TObject; Position: Int64);
        procedure DoDonePlaying(Sender: TObject);
        procedure DoStreamDownloaded(Sender: TObject; Downloaded: Boolean);
      protected
      public
        procedure Initialize(const BASSLibrary: string; const Device: integer;
          Freq: integer; Flags: Cardinal; WND: Cardinal; BGUID: PGUID);
        procedure SetVolume(const NewVolume: integer);
        function _getlength(): Int64;
        procedure SetMute(const Mute: Boolean);
        procedure PlayFile(const FileName: string);
        procedure PlayURL(const URL: string);
      published
        property OnInitialized: TEventInitProc read FOnInitialized
          write FOnInitialized;
        property OnPlaying: TEventPlayingProc read FOnPlaying write FOnPlaying;
        property OnDone: TEventDonePlayingProc read FOnDonePlaying
          write FOnDonePlaying;
        property OnStreamDownloaded: TEventDoneDownload read FOnStreamDownloaded
          write FOnStreamDownloaded;
        property Volume: Single read FVolume;
        property Loop: Boolean read FLoop write FLoop;
    end;
 
  procedure register;
 
  var
    b: TBass;
 
implementation
 
  procedure register;
    begin
      RegisterComponents('HunterComponents', [TBass]);
    end;
 
  { Sync Procs }
 
  procedure sync_playing(HSYNC: Cardinal; Channel: DWORD; Data: DWORD;
    User: Pointer);
    begin
      b.DoPlaying(b, BASS_ChannelGetPosition(Channel, BASS_POS_BYTE));
    end;
 
  procedure sync_doneplaying(HSYNC: Cardinal; Channel: DWORD; Data: DWORD;
    User: Pointer);
    begin
      BASS_ChannelRemoveSync(Channel, HSYNC);
      BASS_StreamFree(Channel);
      b.DoDonePlaying(b);
    end;
 
  procedure sync_downloaded(HSYNC: Cardinal; Channel: DWORD; Data: DWORD;
    User: Pointer);
    begin
      b.DoStreamDownloaded(b, true);
    end;
 
  { TBass }
 
  procedure TBass.DoDonePlaying(Sender: TObject);
    begin
      FOnDonePlaying(Sender);
    end;
 
  procedure TBass.DoInitialized(Sender: TObject; Initialized: Boolean);
    begin
      FInitialized := Initialized;
      FOnInitialized(Sender, Initialized);
    end;
 
  procedure TBass.DoPlaying(Sender: TObject; Position: Int64);
    begin
      FOnPlaying(Sender, Position);
    end;
 
  procedure TBass.DoStreamDownloaded(Sender: TObject; Downloaded: Boolean);
    begin
      FOnStreamDownloaded(Sender, Downloaded);
    end;
 
  procedure TBass.Initialize(const BASSLibrary: string; const Device: integer;
    Freq: integer; Flags, WND: Cardinal; BGUID: PGUID);
    begin
      if BASSLibrary <> '' then
        begin
          if Load_BASSDLL(BASSLibrary) = true then
            begin
              if not BASS_Init(Device, Freq, Flags, WND, BGUID) then
                begin
                  DoInitialized(Self, False);
                end
              else
                begin
                  DoInitialized(Self, true);
                  b := Self;
                end;
            end;
        end;
    end;
 
  procedure TBass.PlayFile(const FileName: string);
    begin
      if FInitialized = true then
        begin
          if FileName <> '' then
            begin
              if BASS_ChannelIsActive(FStream) = BASS_ACTIVE_PLAYING then
                begin
                  BASS_ChannelStop(FStream);
                end;
              FStream := BASS_StreamCreateFile(False, PChar(AnsiString(FileName)
                  ), 0, 0, BASS);
              BASS_ChannelGetAttribute(FStream, BASS_ATTRIB_VOL, FVolume);
              FLength := BASS_ChannelGetLength(FStream, BASS_POS_BYTE);
              BASS_ChannelSetSync(FStream, BASS_SYNC_POS, 0,
                @sync_playing, nil);
              BASS_ChannelSetSync(FStream, BASS_SYNC_DOWNLOAD, 0,
                @sync_downloaded, nil);
              BASS_ChannelPlay(FStream, FLoop);
              BASS_ChannelSetSync(FStream, BASS_SYNC_END, 0,
                @sync_doneplaying, nil);
            end;
        end;
    end;
 
  procedure TBass.PlayURL(const URL: string);
    begin
      if FInitialized = true then
        begin
          if URL <> '' then
            begin
              if BASS_ChannelIsActive(FStream) = BASS_ACTIVE_PLAYING then
                begin
                  BASS_ChannelStop(FStream);
                end;
              FStream := BASS_StreamCreateURL(PAnsiChar(AnsiString(URL)), 0, 0,
                nil, nil);
              BASS_ChannelSetSync(FStream, BASS_SYNC_POS, 0,
                @sync_playing, nil);
              BASS_ChannelSetSync(FStream, BASS_SYNC_END, 0,
                @sync_doneplaying, nil);
              BASS_ChannelSetSync(FStream, BASS_SYNC_DOWNLOAD, 0,
                @sync_downloaded, nil);
              FLength := BASS_ChannelGetLength(FStream, BASS_POS_BYTE);
              BASS_ChannelPlay(FStream, FLoop);
            end;
        end;
    end;
 
  procedure TBass.SetMute(const Mute: Boolean);
    begin
      if Mute = true then
        begin
          BASS_ChannelGetAttribute(FStream, BASS_ATTRIB_VOL, FReservedVolume);
          BASS_ChannelSetAttribute(FStream, BASS_ATTRIB_VOL, 0);
          FVolume := 0;
          Exit;
        end;
      if Mute = False then
        begin
          BASS_ChannelSetAttribute(FStream, BASS_ATTRIB_VOL, FReservedVolume);
          FVolume := FReservedVolume;
          Exit;
        end;
    end;
 
  procedure TBass.SetVolume(const NewVolume: integer);
    begin
      BASS_ChannelSetAttribute(FStream, BASS_ATTRIB_VOL, NewVolume);
      FVolume := NewVolume;
    end;
 
  function TBass._getlength: Int64;
    begin
      Result := BASS_ChannelGetLength(FStream, BASS_POS_BYTE);
    end;
 
  begin
 
end.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
03.02.2017, 10:06
Ответы с готовыми решениями:

Начало работы с аудио библиотекой BASS.net
Всем привет! Возникла такая проблема. Я хочу подключить к своему проекту библиотеку BASS.net Что...

Пишу компонент для Delphi
Здравствуйте, я пишу компонент для работы с сайтом Zaycev.net 1. Компонент не хочет работать 2....

Как пользоваться библиотекой Bass.dll?
Объясните мне как пользоваться библиотекой bass.dll?

Pjsip4net основы для работы с библиотекой
Необходима помощь тех кто работал с данной библиотекой по IP телефонии. Простой пример или...

2
73 / 72 / 43
Регистрация: 17.11.2016
Сообщений: 211
03.02.2017, 11:07 2
С данной библиотекой не работал, но скажу по поводу глобальной переменной.
Кликните здесь для просмотра всего текста

У тебя есть глобальная переменная var b: TBass (строка 63). Через нее компонент передается в sync_playing, sync_doneplaying, sync_downloaded.

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

Судя по описанию из Dynamic_Bass (может, конечно, я нашел не тот):
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
  
SYNCPROC = procedure(handle: HSYNC; channel, data: DWORD; user: Pointer); stdcall;
  {
    Sync callback function. NOTE: a sync callback function should be very
    quick as other syncs cannot be processed until it has finished. If the
    sync is a "mixtime" sync, then other streams and MOD musics can not be
    mixed until it's finished either.
    handle : The sync that has occured
    channel: Channel that the sync occured in
    data   : Additional data associated with the sync's occurance
    user   : The 'user' parameter given when calling BASS_ChannelSetSync
  }
параметр user сделан для передачи данных в колбеки.

Попробуй убрать глобальную переменную b и сделать так:

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
  { Sync Procs }
 
  procedure sync_playing(HSYNC: Cardinal; Channel: DWORD; Data: DWORD;
    User: Pointer);
    begin
       TBass(User).DoPlaying(TBass(User), BASS_ChannelGetPosition(Channel, BASS_POS_BYTE));
    end;
 
  procedure sync_doneplaying(HSYNC: Cardinal; Channel: DWORD; Data: DWORD;
    User: Pointer);
    begin
      BASS_ChannelRemoveSync(Channel, HSYNC);
      BASS_StreamFree(Channel);
      TBass(User).DoDonePlaying(TBass(User));
    end;
 
  procedure sync_downloaded(HSYNC: Cardinal; Channel: DWORD; Data: DWORD;
    User: Pointer);
    begin
      TBass(User).DoStreamDownloaded(TBass(User), true);
    end;
 
...
 
              BASS_ChannelSetSync(FStream, BASS_SYNC_POS, 0,
                @sync_playing, Self);
              BASS_ChannelSetSync(FStream, BASS_SYNC_DOWNLOAD, 0,
                @sync_downloaded, Self);
              BASS_ChannelPlay(FStream, FLoop);
              BASS_ChannelSetSync(FStream, BASS_SYNC_END, 0,
                @sync_doneplaying, Self);
Если я прав, то код станет надежнее.
0
12 / 12 / 6
Регистрация: 15.08.2011
Сообщений: 184
03.02.2017, 18:37  [ТС] 3
К сожалению код вообще не хочет работать
0
03.02.2017, 18:37
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
03.02.2017, 18:37
Помогаю со студенческими работами здесь

Киньте архив с библиотекой для работы с HD44780
Пишу под STM32F4 Dyscovery. Работаю в Coosox IDE Beta(новая версия). Нужна библиотека для работы с...

Требуется С/С++ программист для работы с библиотекой распознавания речи
Есть интересная задача для опытного С/С++ программиста со знаниями в области обработки speech,...

Компонент bass.dll
Я пишу mp3 проигрыватель на delphi, для основы я выбрал bass.dll Подскажите как установить данный...

Библиотека bass vs компонент MPlayer
Есть библиотека bass и компонент MPlayer через них можно воспроизводить музыку и видео вроде так......

Пишу программу для работы с SIP или как читать данные другого процесса?
Люди добрые памагите!!!))) уже неделю мучаюсь с проблемой. Есть sip клиент. и программа написанная...

Куда закинуть bass.dll,bass.h,bass.lib
Ребят, пересмотрел темы на форуме, гуглил, толком ничего не нашел. Собственно такая проблема, вот я...


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

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru