Уроки PureBasic

Categories

Other Sites

Other Sites

Other Sites



             Поиск по сайту

     

                


    Оставить мне сообщение:



Radio BASS  Vinyl

Уроки PureBasic

MP3 плеер, с использованием библиотеки Bass.dll
Ретро вариант.
Для версии PureBasic 4.30


Пластинка крутится - слушаем музыку.

radio bass


Уроки PureBasic

Скачать архив 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 </plaintext> </div><br><br><br><br> <br><br> </div> </div> <!-- copyright (t4) --><div align="center">Используются технологии <a href="http://www.ucoz.ru/" title="Создать сайт бесплатно"><b>uCoz</b></a><br /></div><!-- /copyright --> </body> </html>