Radio BASS Vinyl
MP3 плеер, с использованием библиотеки
Bass.dll
Ретро вариант.
Для версии
PureBasic 4.30
Пластинка крутится - слушаем музыку.
Скачать архив
Radio BASS Viny со всеми
исходниками
Один из вариантов кода:
;==================================================
; Program: GDIPlus Rotation Demo
; Author: netmaestro
; Date: November 12, 2006
;==================================================
; Программа: Плеер-винил
; Автор: mirashic
; Дата: май 2010 год
;==================================================
Enumeration
#Window_0
EndEnumeration
Enumeration
#rot
;#im1
#im2
;#fon
#fon2
#power
#pow_s
#open_list
#open
#pause
#Cont_1
#Play_ListMP3
#File_path
#PlayAll
#vol
#vol1
#fon_vol
#fon_bar
#bar
#bar1
#tex1
#tex2
#tex3
#r_pausa
#back
#forward
#fon5
#fon
EndEnumeration
IncludeFile "bass.pbi"
Global dd, inc.f, Handle, min, Rep.s, Poz.s, NbSongs, cx, vol.f, by, cy, time, tim, len, hhh, ggg, SongPlaying
dd=-100 ; положение power
inc.f =0 ; скорость диска
cx= 25 ; начальная координата ручки громкости
vol=0.5 ; начальная громкость
by=308 ; координата y бар
hhh= -1000
ggg= -114
UsePNGImageDecoder()
CatchImage(#fon, ?Im1, ?Im1End -?Im1 ) ; фон контейнера
CatchImage(#power, ?Im2, ?Im2End -?Im2 ) ; кнопка power
CatchImage(#pow_s, ?Im3, ?Im3End -?Im3 ) ; горит power
CatchImage(#open_list,?Im4, ?Im4End -?Im4 ) ; показать плейлист
CatchImage(#fon2, ?Im5, ?Im5End -?Im5 ) ; фон окно
CatchImage(#vol, ?Im6, ?Im6End -?Im6 ) ; регулятор громкости
CatchImage(#fon_vol, ?Im7, ?Im7End -?Im7 ) ; фон регулятора громкости
CatchImage(#bar, ?Im9, ?Im9End -?Im9 ) ; бар
CatchImage(#fon_bar, ?Im10, ?Im10End-?Im10) ; фон-трек-бар
CatchImage(#r_pausa, ?Im11, ?Im11End-?Im11) ; ручка пауза
;CatchImage(#fon5, ?Im12, ?Im12End-?Im12) ; ??????????
CreateImage(#bar1,24,120) ; создаём трек вар
CreateImage(#vol1,60,11) ; создаём громкость
CreateImage(#rot,137,137,32) ; ротатор
#background = 0 ; image# for background
CompilerIf Defined(GdiplusStartupInput, #PB_Structure) = 0
Structure GdiplusStartupInput
GdiPlusVersion.l
*DebugEventCallback.Debug_Event
SuppressBackgroundThread.l
SuppressExternalCodecs.l
EndStructure
CompilerEndIf
Procedure InitGDIPlus()
OpenLibrary(0, "gdiplus.dll")
input.GdiplusStartupInput
input\GdiPlusVersion = 1
CallFunction(0, "GdiplusStartup", @*token, @input, #Null)
ProcedureReturn *token
EndProcedure
Procedure ShutDownGDIPlus(*token)
CallFunction(0, "GdiplusShutdown", *token)
CloseLibrary(0)
EndProcedure
Procedure StringToBStr (string$) ; By Zapman Inspired by Fr34k
Protected Unicode$ = Space(Len(String$)* 2 + 2)
Protected bstr_string.l
PokeS(@Unicode$, String$, -1, #PB_Unicode)
bstr_string = SysAllocString_(@Unicode$)
ProcedureReturn bstr_string
EndProcedure
Procedure RotateImage(*image, bkgimage, angle.f)
width=ImageWidth(bkgimage)
height=ImageHeight(bkgimage)
wmidf.f = width/2
hmidf.f = height/2
wmid.l = height/2
hmid.l = height/2
hdc=StartDrawing(ImageOutput(bkgimage))
Box(0,0,width,height,RGB(11, 7, 6)) ;GetSysColor_(#COLOR_BTNFACE)
DrawImage(ImageID(#fon),hhh,-100,435,550) ; фон контейнера
DrawImage(ImageID(#fon2),ggg,-100,435,550) ; фон контейнера
CallFunction(0, "GdipCreateFromHDC", hdc, @*surface)
CallFunction(0, "GdipRotateWorldTransform", *surface, angle, 1)
CallFunction(0, "GdipTranslateWorldTransform", *surface, wmidf, hmidf, 1)
CallFunction(0, "GdipDrawImageRectI", *surface, *image, wmid, hmid, -width, -height)
CallFunction(0, "GdipResetWorldTransform", *surface)
StopDrawing()
CallFunction(0, "GdipDeleteGraphics", *surface)
EndProcedure
Procedure Loadfile(*x) ; Создание потокового звука, получаемыми из сети Интернет
BASS_StreamFree(Handle)
Handle=BASS_StreamCreateURL("http://91.121.91.110:3000", 0, 0, #Null, 0)
BASS_ChannelPlay(Handle,0)
BASS_ChannelSetAttribute( Handle,#BASS_ATTRIB_VOL,1)
inc.f =1.5
EndProcedure
Procedure Animate_Gadget() ; Развернуть/Свернуть плейлист
If min=1 ; Развернуть плейлист
For i=360 To 550 Step 2
ResizeWindow(#Window_0,#PB_Ignore,#PB_Ignore,#PB_Ignore ,i )
For x=1 To 10
WindowEvent()
Next x
Delay(8)
Next i
Else ; Свернуть плейлист
For i=550 To 360 Step -2 ; Свернуть плейлист
ResizeWindow(#Window_0,#PB_Ignore,#PB_Ignore,#PB_Ignore ,i )
For x=1 To 10
WindowEvent()
Next x
Delay(8)
Next i
EndIf
EndProcedure
Procedure Direct() ; Ск. директории
NbSongs = 0
SetGadgetText(#File_path, GetPathPart(Rep))
ClearGadgetItems(#Play_ListMP3)
If ExamineDirectory(0, GetPathPart(Rep), "*.*")
Repeat
FileType = NextDirectoryEntry(0)
If FileType
FileName.s = DirectoryEntryName(0)
If FileName.s <> "." And FileName.s <> ".."
Ext$ = LCase(Right(FileName.s,4))
If Ext$ = ".wav" Or Ext$ = ".mp3" Or Ext$ = ".mid"
AddGadgetItem(#Play_ListMP3, -1, FileName.s)
NbSongs = NbSongs + 1
EndIf
EndIf
EndIf
SetGadgetState(#Play_ListMP3, SongPlaying )
Until FileType = 0
EndIf
EndProcedure
Procedure Play() ; Играть MP3
BASS_StreamFree(Handle) ; очищаем поток
File.s = GetGadgetText(#File_path)+GetGadgetText(#Play_ListMP3) ; получаем путь из суммы директории и имени с плей листа
Name.s= GetFilePart(File.s) ;выделяем имя файла из полного пути
If File
Handle=BASS_StreamCreateFile(0, @File, 0, 0, 0)
BASS_ChannelPlay(Handle,0)
SetGadgetState(#PlayAll, 1) ; да/нет поочередное проигр
BASS_ChannelSetAttribute( Handle,#BASS_ATTRIB_VOL,vol)
EndIf
inc.f =0.45
EndProcedure
Procedure Stroka() ; Индикация
;-------------трек бар-----------------------------------------
len=BASS_ChannelGetLength(Handle, #BASS_POS_BYTE)
tim=BASS_ChannelBytes2Seconds(Handle, len) ; длина трека в секундах
time = BASS_ChannelBytes2Seconds(Handle, BASS_ChannelGetPosition(Handle, #BASS_POS_BYTE)) ; начало отсчёта с ноля
StartDrawing(ImageOutput(#bar1))
DrawImage(ImageID(#fon_bar),0,0,24,120)
If tim>0
DrawImage(ImageID(#bar),2,103-((time*100)/tim),22,17)
Else
DrawImage(ImageID(#bar),2,103,22,17)
EndIf
StopDrawing()
SetGadgetState(#bar1,ImageID(#bar1))
;--------------------------Таймер--------------------------------------------
text$ = Str(time/60) + ":" + RSet(Str(time % 60), 2, "00") ; преобразование секунд в мин.сек
If BASS_ChannelIsActive(Handle) = #BASS_ACTIVE_STOPPED
SetGadgetText(#tex1, " 00:00")
Else ; если канал активен начинаем отсчет
SetGadgetText(#tex1, " "+text$)
EndIf
minute$ = Str(Minute(tim))
sekunde$ = Str(Second(tim))
rez$ = minute$+":"+sekunde$
SetGadgetText(#tex2 , " "+rez$) ; выводим время звучания композиции
;--------------------------Гормкость--------------------------------------------
StartDrawing(ImageOutput(#vol1))
DrawImage(ImageID(#fon_vol),0,0,60,11)
If cx<50 And cx>5
DrawImage(ImageID(#vol),cx,0,13,10)
ElseIf cx>50
DrawImage(ImageID(#vol),48,0,13,10)
ElseIf cx<5
DrawImage(ImageID(#vol),5,0,13,10)
EndIf
StopDrawing()
SetGadgetState(#vol1,ImageID(#vol1))
;--------------------------Заголовок в окне----------------------------------------
max = CountGadgetItems(#Play_ListMP3)
pozis = GetGadgetState(#Play_ListMP3)+1
If BASS_ChannelIsActive(Handle) ; если канал активен
SetWindowTitle(#Window_0, GetGadgetText(#Play_ListMP3)+" "+Str(pozis)+"/"+Str(max) )
Else
SetWindowTitle(#Window_0, "Винил mp3")
EndIf
EndProcedure
*token = InitGDIPlus()
CallFunction(0, "GdipCreateBitmapFromFile", StringToBStr("винил_мини4.png"), @*wheeldisc)
OpenWindow(#Window_0,0,0,435,360,"Винил mp3",#PB_Window_ScreenCentered|#PB_Window_SystemMenu|#PB_Window_MinimizeGadget)
ImageGadget(#im2,114,100,137,137,0) ; ротатор
ImageGadget(#open_list,10,296,35,35,0) ; показать плейлист
ImageGadget(#power,24,26,21,18,ImageID(#power)) ; power
ImageGadget(#pow_s,302,25,16,16,0) ; горит power
ImageGadget(#vol1,323,288,60,11,ImageID(#vol1)) ; фон регулятора громкости
ImageGadget(#bar1,394,212,24,120,ImageID(#bar1)) ; фон бар трек
ImageGadget(#r_pausa,381,108,40,60,0) ; пауза рычаг
ImageGadget(#back,54,320,13,13,0) ; <<<<
ImageGadget(#forward,79,320,13,13,0) ; >>>>
TextGadget(#tex1, 220, 371, 60, 14, "00:00")
SetGadgetColor(#tex1, #PB_Gadget_BackColor,RGB(21, 21, 21))
SetGadgetColor(#tex1, #PB_Gadget_FrontColor , RGB(93, 93, 93))
TextGadget(#tex2, 280, 371, 33, 14, "00:00")
SetGadgetColor(#tex2, #PB_Gadget_BackColor,RGB(21, 21, 21))
SetGadgetColor(#tex2, #PB_Gadget_FrontColor , RGB(93, 93, 93))
TextGadget(#tex3, 312, 371, 40, 14, " минут")
SetGadgetColor(#tex3, #PB_Gadget_BackColor,RGB(21, 21, 21))
SetGadgetColor(#tex3, #PB_Gadget_FrontColor , RGB(93, 93, 93))
HyperLinkGadget(#open, 30, 371, 50, 14, "Открыть", RGB(181, 181, 181))
SetGadgetColor(#open, #PB_Gadget_FrontColor , RGB(93, 93, 93))
PureCOLOR_SetGadgetColor(#open, #PureCOLOR_SystemColor, #PureCOLOR_DontSetBackColor)
HyperLinkGadget(#pause, 120, 371, 35, 14, "Пауза", RGB(181, 181, 181))
SetGadgetColor(#pause, #PB_Gadget_FrontColor , RGB(93, 93, 93))
PureCOLOR_SetGadgetColor(#pause, #PureCOLOR_SystemColor, #PureCOLOR_DontSetBackColor)
ContainerGadget(#Cont_1,11,400,412,136) ; mp3
ListViewGadget(#Play_ListMP3, -2, -2, 436, 151)
PureCOLOR_SetGadgetColor(#Play_ListMP3, RGB(93, 93, 93),RGB(21, 21, 21))
TextGadget(#File_path,0,0,0,0,"Путь")
CloseGadgetList()
CheckBoxGadget(#PlayAll,0, 0, 0 , 0, "") ; поочередное проигр
SetGadgetState(#PlayAll, 0)
;{-----Чтение пути-----------------
If OpenPreferences("плейлист.pcs")
Rep.s = ReadPreferenceString("Путь", "Нет")
Poz.s = ReadPreferenceString("Позиция", "Нет")
ClosePreferences()
EndIf
SongPlaying = Val(Poz.s)
Direct()
;}-----------------------------
SetWinBackgroundImage(WindowID(#Window_0), ImageID(#fon2) ) ; фон окна
BASS_Init(-1, 44100, 0, WindowID(#Window_0), #Null)
SetTimer_(WindowID(#Window_0),Event,55,@Stroka()) ; вывод бегущей строки
Repeat
Event = WindowEvent()
Window = EventWindow()
Gadget = EventGadget()
mx.l = WindowMouseX(#Window_0) ; координаты x
my.l = WindowMouseY(#Window_0) ; координаты y
;Debug mx
;Debug my
;------переключение треков-----------------------
If GetGadgetState(#PlayAll) ; да или нет
If BASS_ChannelIsActive(Handle) ; если канал активен
Else
SongPlaying = GetGadgetState(#Play_ListMP3)+ 1
If SongPlaying < NbSongs
SetGadgetState(#Play_ListMP3, SongPlaying )
Play()
EndIf
EndIf
EndIf
;----------------------power--------------------------
If ((mx > 25 And mx < 45) And (my > 25 And my < 45))
SetCursor_(LoadCursor_(0,#IDC_HAND)) ; курсор рука
If EventType()=#PB_EventType_LeftClick
power = power ! 1
If power=1
dd=272
inc.f =0.01
SetGadgetState(#power,0)
SetGadgetState(#pow_s,ImageID(#pow_s))
Else
BASS_StreamFree(Handle)
dd=-100 ; убрать горит power
inc.f =0
SetGadgetState(#power,ImageID(#power))
SetGadgetState(#pow_s,0)
If min = 1
min = 0
Animate_Gadget() ; закрыть плейлист
EndIf
SetGadgetState(#PlayAll, 0)
EndIf
EndIf
EndIf
If dd =272 ; если включен power
;-----------------ротатор-----------------------------------
angle.f+inc.f:
If angle >=360:
angle=0:
EndIf
RotateImage(*wheeldisc, #background, angle)
SetGadgetState(#im2,ImageID(#background))
;----------------------плейлист--------------------------
If ((mx > 10 And mx < 45) And (my > 296 And my < 331))
SetCursor_(LoadCursor_(0,#IDC_HAND)) ; курсор рука
SetGadgetState(#open_list, ImageID(#open_list))
If EventType()=#PB_EventType_LeftClick
min = min ! 1
Animate_Gadget()
EndIf
Else
SetGadgetState(#open_list,0)
EndIf
;------------рука над громкостью----------------------------
If ((mx > 323 And mx < 383) And (my > 288 And my < 299))
SetCursor_(LoadCursor_(0,#IDC_HAND)) ; курсор рука
If #WM_MOUSEMOVE
GetAsyncKeyState_(#VK_LBUTTON)
If GetAsyncKeyState_(#VK_LBUTTON)
mx=WindowMouseX(#Window_0)
cx=mx-GadgetX(#vol1)-5
vol=(mx - 330)/50
BASS_ChannelSetAttribute( Handle,#BASS_ATTRIB_VOL,vol)
EndIf
EndIf
EndIf
;------------рука над трек баром----------------------------
If ((mx > 395 And mx < 415) And (my > 215 And my < 325))
SetCursor_(LoadCursor_(0,#IDC_HAND)) ; курсор рука
EndIf
;------------рука над трек назад----------------------------
If ((mx > 54 And mx < 67) And (my > 320 And my < 333))
SetCursor_(LoadCursor_(0,#IDC_HAND)) ; курсор рука
If EventType()=#PB_EventType_LeftClick
SongPlaying = GetGadgetState(#Play_ListMP3)- 1
If SongPlaying < NbSongs
SetGadgetState(#Play_ListMP3, SongPlaying )
If BASS_ChannelIsActive(Handle) ; если канал активен
Play()
EndIf
EndIf
EndIf
EndIf
;------------рука над трек вперёд----------------------------
If ((mx > 79 And mx < 92) And (my > 320 And my < 333))
SetCursor_(LoadCursor_(0,#IDC_HAND)) ; курсор рука
If EventType()=#PB_EventType_LeftClick
SongPlaying = GetGadgetState(#Play_ListMP3)+ 1
If SongPlaying < NbSongs
SetGadgetState(#Play_ListMP3, SongPlaying )
If BASS_ChannelIsActive(Handle) ; если канал активен
Play()
EndIf
EndIf
EndIf
EndIf
;-----------------рука над пауза----------------------------
If ((mx > 400 And mx < 410) And (my > 130 And my < 160))
SetCursor_(LoadCursor_(0,#IDC_HAND)) ; курсор рука
If EventType()=#PB_EventType_LeftClick
If BASS_ChannelIsActive(Handle) ; если канал активен
Pausa = Pausa ! 1
If Pausa
SetGadgetState(#r_pausa,ImageID(#r_pausa))
BASS_ChannelPause(Handle)
inc.f =0.03
hhh=-114
ggg=-1000
SetWinBackgroundImage(WindowID(#Window_0), ImageID(#fon) ) ; фон окна
Else
SetGadgetState(#r_pausa,0)
BASS_ChannelPlay(Handle,0)
inc.f =0.5
hhh=-1000
ggg=-114
SetWinBackgroundImage(WindowID(#Window_0), ImageID(#fon2) ) ; фон окна
EndIf
EndIf
EndIf
EndIf
EndIf
;-----------------------------------------------------------
Select Event
Case #WM_LBUTTONDBLCLK ; обработка события на двойной клик
If Gadget = #Play_ListMP3
Play()
EndIf
Case #PB_Event_Gadget
Select EventGadget()
Case #open
If EventType()=#PB_EventType_LeftClick
Rep.s = OpenFileRequester("","","*.*|*.*",0)
Direct()
;---Совпадение плейлиста и открыт. mp3-------------------
Nasd.s= GetFilePart(Rep.s) ; извлекаем имя
For n=0 To 1000
SetGadgetState(#Play_ListMP3, n)
If Nasd.s =GetGadgetText(#Play_ListMP3)
SetGadgetState(#Play_ListMP3, n)
Break
EndIf
Next
;--------------------------------------------------------
If Nasd.s <> ""
Play()
EndIf
EndIf
Case #vol1 ; управление громкостью
If dd =272
If EventType()=#PB_EventType_LeftClick
EndIf
EndIf
Case #bar1 ; управление бар треком
If EventType()=#PB_EventType_LeftClick
y=WindowMouseY(#Window_0) ;Возвращает Y координату положения курсора мыши во внутренней области окна
cy=100-(y-GadgetY(#bar1)) ;GadgetX(289)-Возвращает координату X указанного #Gadget
pos=cy*((len)/100) ; 259 - длина бара (pos меняет значение от 0 до len )
BASS_ChannelSetPosition(Handle, pos, #BASS_POS_BYTE)
EndIf
Case #pause
Pausa = Pausa ! 1
If Pausa
BASS_ChannelPause(Handle)
SetGadgetState(#r_pausa,ImageID(#r_pausa))
inc.f =0.03
hhh=-114
ggg=-1000
SetWinBackgroundImage(WindowID(#Window_0), ImageID(#fon) ) ; фон окна
Else
BASS_ChannelPlay(Handle,0)
SetGadgetState(#r_pausa,0)
inc.f =0.5
hhh=-1000
ggg=-114
SetWinBackgroundImage(WindowID(#Window_0), ImageID(#fon2) ) ; фон окна
EndIf
EndSelect
EndSelect
If Event = #PB_Event_CloseWindow
;{----Запись параметров перед выходом-----------
OpenPreferences("плейлист.pcs")
WritePreferenceString("Путь",Rep.s)
WritePreferenceString("Позиция",Str(GetGadgetState(#Play_ListMP3)))
ClosePreferences()
Break
EndIf
ForEver
ShutDownGDIPlus(*token)
DataSection
Im2:
IncludeBinary "вкл.png" ; кнопка power
Im2End:
Im3:
IncludeBinary "вкл_цвет.png" ; горит power
Im3End:
Im4:
IncludeBinary "плейлист.png" ; показать плейлист
Im4End:
Im5:
IncludeBinary "фон4.png" ; фон 2
Im5End:
Im6:
IncludeBinary "регулятор.png" ; регулятор громкости
Im6End:
Im7:
IncludeBinary "фон-регулятора.png" ; фон громкости
Im7End:
Im9:
IncludeBinary "трек-бар.png" ; трек-бар
Im9End:
Im10:
IncludeBinary "фон-трек-бар.png" ; фон-трек-бар
Im10End:
Im11:
IncludeBinary "ручка-пауза.png" ; ручка пауза
Im11End:
Im1:
IncludeBinary "фон66.png" ; ручка пауза
Im1End:
EndDataSection