* * *    
Главная » Статьи » Код PB

Просмотров: 16521 | Дата: 26.04.2024 | Коментарии (0)

Bass.dll библиотека




Небольшая памятка по работе библиотеке BASS.

Из справки:
Библиотека BASS разработана un4seen.com developments. и содержит набор функций для воспроизведения звуковых файлов различных форматов, а также для записи звука.
Лицензионным соглашением допускается бесплатное использование BASS в некоммерческих целях
На официальном сайте можно скачать последнею версию библиотеки. У меня это bass.dll 2.4.4.0
Для работы bass.dll совместно с PureBasic нужны ещё два файла:

bass.pbi
bass.lib

и сама библиотека bass.dll

Все эти файлы помещаем в одну директорию (после компиляции, bass.pbi и bass.lib не нужны).

Библиотека BASS достаточно проста в использовании, имеет небольшой размер и поддерживает следующие возможности:

1. Воспроизведение звуковых образцов (сэмплов) в формате WAV/AIFF/MP3/MP2/MP1/OGG;
2. Потоковое воспроизведение звуковых файлов в формате MP3/MP2/MP1/OGG/WAV/AIFF;
3. Потоковое воспроизведение звука из интернет (по протоколам http и ftp, с поддержкой серверов Shoutcast, Icecast & Icecast2);
4. Воспроизведение файлов музыкальных форматов (XM, IT, S3M, MOD, MTM, UMX), а также формата MO3 (mod музыка, сжатая MP3/OGG);
5. Запись звука;
6. Поддержка эффектов обработки звуков и эффектов DirectX 8 (только для Win32): Chorus / compressor / distortion / echo / flanger / gargle / parametric eq / reverb и т.д.;
7. Поддержка многоканального (а не только стерео) звука, в том числе и многоканальных OGG/WAV/AIFF файлов;
8. Поддержка многопотоковых звуковых карт;
9. Поддержка позиционируемого 3D звука и EAX;
10.Поддержка расширений (плагинов);
и многое другое.


Справка на английском языке.

Начнем от простого к сложному...

Подключение

Enumeration 
 #Window_0
EndEnumeration
IncludeFile "bass.pbi" ; библиотека BASS

OpenWindow(#Window_0,0,0,400,200,"Bass.dll",#WS_OVERLAPPEDWINDOW|#PB_Window_ScreenCentered) 

BASS_Init(-1, 44100, 0, WindowID(#Window_0), #Null) ; инициализация
Repeat 
Event= WaitWindowEvent() 
Until Event= #PB_Event_CloseWindow
;


После компиляции ничего не произойдет, если все правильно.

Звуковой поток

Начнем с звукового потока Fm радио.
Все пояснения пишу в коде:

Enumeration 
 #Window_0
EndEnumeration
IncludeFile "bass.pbi" ; библиотека BASS

OpenWindow(#Window_0,0,0,400,200,"Bass.dll",#WS_OVERLAPPEDWINDOW|#PB_Window_ScreenCentered) 

BASS_Init(-1, 44100, 0, WindowID(#Window_0), #Null) ; инициализация

url.s="http://193.46.83.122:8030" ; адрес звукового потока
BASS_StreamFree(Handle) ; очищаем поток, если был повторный вызов
Handle=BASS_StreamCreateURL(url.s, 0, 0, #Null, 0) ;Создает образца поток из MP3, MP2, MP1, OGG, WAV, AIFF 
BASS_ChannelPlay(Handle,0) ;воспроизведения образца
BASS_ChannelSetAttribute( Handle,#BASS_ATTRIB_VOL,1) ;атрибут громкости от 0 до 1 

Repeat 
Event= WaitWindowEvent() 
Until Event= #PB_Event_CloseWindow
;


Вывод тегов

Используем функцию BASS_ChannelGetTags() с флагом #BASS_TAG_META
Метаданные. Возвращает адрес в памяти на строку содержащий текущее название потока и URL
Формат строки: StreamTitle = "XXX"; StreamUrl = "XXX";

Enumeration 
 #Window_0
EndEnumeration
IncludeFile "bass.pbi" ; библиотека BASS

Structure D3 ;сруктура тегов информации 
 title.s{150}
EndStructure
Global *tg.D3

OpenWindow(#Window_0,0,0,400,200,"Bass.dll",#WS_OVERLAPPEDWINDOW|#PB_Window_ScreenCentered) 

BASS_Init(-1, 44100, 0, WindowID(#Window_0), #Null) ; инициализация

url.s="http://193.46.83.122:8030" ; адрес звукового потока
BASS_StreamFree(Handle) ; очищаем поток
Handle=BASS_StreamCreateURL(url.s, 0, 0, #Null, 0) ;Создает образца поток из MP3, MP2, MP1, OGG, WAV, AIFF 
BASS_ChannelPlay(Handle,0) ;воспроизведения образца
BASS_ChannelSetAttribute( Handle,#BASS_ATTRIB_VOL,1) ;атрибут громкости от 0 до 1 


 If Handle 
 *tg = BASS_ChannelGetTags(Handle, #BASS_TAG_META) 
 If *tg
 Debug *tg\title ; название песни
 EndIf 
 EndIf


Repeat 
Event= WaitWindowEvent() 
Until Event= #PB_Event_CloseWindow
;


Парсинг строки с тегами

Произведем парсинг строки и вызов её по таймеру, так как метаданные у нас меняются со временем:


Enumeration
 #Window_0
 #teg
 #title
 #strim
EndEnumeration
IncludeFile "bass.pbi" ; библиотека BASS

Structure D3 ; информ fm
 title.s{150}
EndStructure
Global *tg.D3, Handle

Procedure.s Between_2(string.s, L.s, R.s) 
 Position = FindString(string, L.s, 1)
 string2.s = Right(string, Len(string)+1-Position-Len(L.s))
 Position2 = FindString(string2, R.s, 1)
 string3.s = Left(string2, Position2-1)
 If Position <> 0
 ProcedureReturn string3.s
 EndIf 
EndProcedure

Procedure Tamer()
 If Handle 
 *tg = BASS_ChannelGetTags(Handle, #BASS_TAG_META) 
 If *tg
 string.s = *tg\title ; название песни
 SetGadgetText(#teg, string.s ) ; вся строка
 title.s= Between_2(string.s, "'", "'")
 string.s = RemoveString(string.s, "'"+title.s+"'")
 strim.s= Between_2(string.s, "'", "'")
 SetGadgetText(#title, title.s ) ; назв.песни
 SetGadgetText(#strim, strim.s ) ; поток
 EndIf 
 EndIf
EndProcedure

OpenWindow (#Window_0,0,0,580,200,"Вывод тегов", #WS_OVERLAPPEDWINDOW|#PB_Window_ScreenCentered ) 
BASS_Init(-1, 44100, 0, WindowID(#Window_0), #Null) ; инициализация

url.s="http://193.46.83.122:8030"
Handle=BASS_StreamCreateURL(url.s, 0, 0, #Null, 0) 
BASS_ChannelPlay(Handle,0)
BASS_ChannelSetAttribute( Handle,#BASS_ATTRIB_VOL,1); начальная громкость

TextGadget(#teg,5,15,570,15, "вся строка")
TextGadget(#title,5,45,570,15,"назв.песни")
TextGadget(#strim,5,75,570,15,"поток")


SetTimer_(WindowID(#Window_0),Event,350,@Tamer()) ;опрос по таймеру
Repeat 
Event= WaitWindowEvent() 
Until Event= #PB_Event_CloseWindow
;


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

Enumeration
 #Window_0
 #teg
 #title
 #strim
EndEnumeration
IncludeFile "bass.pbi" ; библиотека BASS
 
Structure D3 ; информ fm
 title.s{150}
EndStructure
Global *tg.D3, Handle
 
Procedure Tamer()
 If Handle 
 *tg = BASS_ChannelGetTags(Handle, #BASS_TAG_META) 
 If *tg
 SetGadgetText(#teg, *tg\title ) ;вся строка
 CreateRegularExpression(0,"(')(.*?)(')",#PB_RegularExpression_DotAll)
 Dim Matched.s(2)
 ExtractRegularExpression(0,*tg\title,Matched())
 FreeRegularExpression(0)
 SetGadgetText(#title, RemoveString(Matched(0), "'") ) ; назв.песни
 SetGadgetText(#strim, RemoveString(Matched(1), "'") ) ; поток
 EndIf
 EndIf
EndProcedure
 
OpenWindow (#Window_0,0,0,580,200,"Вывод тегов", #WS_OVERLAPPEDWINDOW|#PB_Window_ScreenCentered ) 
BASS_Init(-1, 44100, 0, WindowID(#Window_0), #Null) ; инициализация

url.s="http://193.46.83.122:8030"
Handle=BASS_StreamCreateURL(url.s, 0, 0, #Null, 0) 
BASS_ChannelPlay(Handle,0)
BASS_ChannelSetAttribute( Handle,#BASS_ATTRIB_VOL,1); начальная громкость
 
TextGadget(#teg,5,15,570,15, "вся строка")
TextGadget(#title,5,45,570,15,"назв.песни")
TextGadget(#strim,5,75,570,15,"поток")
 
 
SetTimer_(WindowID(#Window_0),Event,350,@Tamer()) ;опрос по таймеру
Repeat
Event= WaitWindowEvent() 
Until Event= #PB_Event_CloseWindow
;


Запись потока

Для записи потока в функции BASS_StreamCreateURL() добавляем адрес процедуры записи Rec()

Procedure Rec(*mem,*length, user) ; процедура записи
; *mem указатель на буфер для загружаемых данных ... NULL = завершения загрузки
; *length Длина число байт в буфере ... 0 = HTTP или ICY тегов.
 WriteData(#file,*mem, *length)
EndProcedure

Handle=BASS_StreamCreateURL(url.s", 0, 0, @Rec(), 0)
;


Весь код будет иметь вид:

Enumeration
 #Window_0
 #file
 #Hyper
EndEnumeration

IncludeFile "bass.pbi" ; библиотека BASS
Global rec=0

;Global *mem=AllocateMemory(400000) ;Выделяет область памяти указанного размера

Procedure Rec(*mem,*length, user) ; процедура записи
If rec=1
 WriteData(#file,*mem, *length)
EndIf
EndProcedure

OpenWindow (#Window_0,0,0,200,100,"Запись Bass", #WS_OVERLAPPEDWINDOW|#PB_Window_ScreenCentered )
 HyperLinkGadget(#Hyper,15,50,100,15,"Воспроизведение",RGB(253, 2, 2))

 BASS_Init(-1, 44100, 0, WindowID(#Window_0), #Null) ; инициализация
 Handle=BASS_StreamCreateURL("http://193.46.83.122:8030", 0, 0, @Rec(), 0)
 BASS_ChannelPlay(Handle,0) ;играть
 BASS_ChannelSetAttribute( Handle,#BASS_ATTRIB_VOL,1) ; начальная громкость

Repeat
Event = WaitWindowEvent()
Window = EventWindow()
Gadget = EventGadget()
 Select Event
 Case #PB_Event_Gadget
 Select EventGadget()
 Case #Hyper
 Klik = Klik ! 1
 If Klik=1
 SetGadgetText(#Hyper, "Идёт звпись!")
 name.s=FormatDate("%hh_%ii_%ss"+".mp3", Date()) ;имя файла
 CreateFile(#file,name) ;создаём файл для записи
 rec=1
 Else
 SetGadgetText(#Hyper, "Воспроизведение")
 rec=0
 CloseFile(#file)
 EndIf
 EndSelect
 EndSelect
If Event = #PB_Event_CloseWindow
Break
EndIf
ForEver
;


Спектр звукового сигнала




Используется функция BASS_ChannelGetData(Handle,@FFT(),#BASS_DATA_FFT2048).
Где #BASS_DATA_FFT4096 (может быть от 256 до 8192) - это константа, которая задаёт 4096 выборок.
Функция возвращает 2048 значений для моно сигнала (1 канал) в массив FFT.
Вторая половина массива для моно - пустая!
Каждый период времени можно получать данные амплитуд на определенных частотах.
FFT(f) - значении амплитуды на частоте (f). Т.е. для каждой частоты в массиве будет своя амплитуда

Enumeration
 #Window_0
 #file
 #spektr
 #Hyper
EndEnumeration
IncludeFile "bass.pbi" ; библиотека BASS
Global Handle

CreateImage(#spektr,1,15) ; спектр

Procedure Tamer()
;----------спектр----------------------
Dim FFT.f(1024)
wer=BASS_ChannelGetData(Handle,@FFT(),#BASS_DATA_FFT2048)
 For f=0 To 85
 Val= Sqr(FFT(f)) * 40 ;получение параметра по частотам
 If wer= -1
 Val=1
 EndIf
 StartDrawing(ImageOutput(#spektr))
 Box(0,0,1,15,RGB(0, 0, 0))
 Box(0,15-Val,1,Val,RGB(20, 57, 235))
 Box(0,15-Val,1,Val/6,RGB(250, 3, 5))
 StopDrawing()
SetGadgetState(100+f,ImageID(#spektr))
 Next f
 ;------------------------------------------------
EndProcedure

OpenWindow (#Window_0,0,0,200,70,"Спектр Bass", #WS_OVERLAPPEDWINDOW|#PB_Window_ScreenCentered )
 SetWindowColor(#Window_0,RGB(0, 0, 0))
 x=10:y=23 ; начальные координаты, f - количество столбов
 For f=0 To 85
 ImageGadget(100+f,x,y,0,0,ImageID(#spektr)) ; вывод спектра
 x=x+(1+1)
 Next f

BASS_Init(-1, 44100, 0, WindowID(#Window_0), #Null) ; инициализация

 Handle=BASS_StreamCreateURL("http://193.46.83.122:8030", 0, 0, 0, 0)
 BASS_ChannelPlay(Handle,0) ;играть
 BASS_ChannelSetAttribute( Handle,#BASS_ATTRIB_VOL,1) ; начальная громкость

SetTimer_(WindowID(#Window_0),Event,50,@Tamer()) ;опрос по таймеру

Repeat
Event= WaitWindowEvent()
Until Event= #PB_Event_CloseWindow
;


Продолжение











Сайт посвящён языку программирования PureBasic — коммерческий компилятор языка программирования, использующего синтаксис BASIC. Предназначен для создания кроссплатформенных приложений для AmigaOS, Linux, Microsoft Windows, Windows NT и Mac OS X. Разработан компанией Fantaisie Software.