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
;
Продолжение