Posted: Fri Jul 18, 2003 3:27 pm
by naw
Hi, I got MovieSeek working off a TrackBarGadget()... Problems come in with some MP3s that have very high # of Frames (shown as negative values)...
Ta - N
; PureBasic Visual Designer v3.62
;- MenuBar Constants
;
#MenuBar_9 = 0
#MENU_1 = 1
#MENU_2 = 2
#MENU_3 = 3
#MENU_6 = 4
#MENU_4 = 5
;- Gadget Constants
;
#STATUS=0
#B_PLAYLIST = 1
#LOAD = 2
#SAVE = 3
#DELALL = 4
#PROGRESS = 5
#FADEIN = 6
#FADEOUT = 7
#VOLUME = 8
#T_PROGRESS = 9
#T_START = 10
#T_STOP = 11
#BALANCE = 12
#PLAYLIST_FILE = 13
#B_TRACKLIST = 14
#TRACKINFO = 15
#REW = 16
#FF = 17
#PAUSE = 18
#PLAY = 19
#STOP = 20
#PREV = 23
#NEXT = 24
#TRACKLIST = 25
#PLAYLIST = 26
#RECORD = 29
#HELP=30
;-PlayList AutoNav*
#PL_MOVEDN = 21
#PL_MOVEUP = 22
#PL_DELTRK =27
#PL_STOP=28
#IMG_PLAY=1
#IMG_PAUSE=2
#IMG_FWD=3
#IMG_REW=4
#IMG_PREV=5
#IMG_NEXT=6
#IMG_DEL=7
#IMG_REC=8
#IMG_DELALL=9
#IMG_MOVEUP=10
#IMG_MOVEDN=11
#IMG_INSSTOP=12
#IMG_STOP=13
;- StatusBar Constants
;
#StatusBar_11 = 0
;- Other Stuff
DefType.l
#FRAMEDIV.f=1000000000
#DEBUG=1
#DELAY=10
TRACKCTR=0
HELP$="Hints and tips are shown here..."+Chr(13)+" ...Before Loading an Tracks, Press all the buttons to discover what they do."+Chr(13)+" - just cancel any 'File Save' / 'File Load' Dialogue boxes..."
Global TRACKCTR, HELP$
Procedure.s ReadINI(section.s,key.s,empty.s,inifile.s)
result.s=Space(255)
GetPrivateProfileString_(section,key,empty,@result,255,inifile)
ProcedureReturn result.s
EndProcedure
Procedure.l WriteINI(section.s,key.s,value.s,inifile.s)
ProcedureReturn WritePrivateProfileString_(section,key,value,inifile)
EndProcedure
Procedure Open_Window_0()
If OpenWindow(0, 343, 80, 620, 370, #PB_Window_SystemMenu |#PB_Window_TitleBar | #PB_Window_BorderLess | #PB_Window_ScreenCentered , "New window ( 0 )")
SetWindowPos_(WindowID(),#HWND_TOPMOST,200,200,0,0,#SWP_NOMOVE|#SWP_NOSIZE)
If CreateGadgetList(WindowID())
ComboBoxGadget(#PLAYLIST, 20, 30, 220, 240, #PB_ComboBox_Editable): AddGadgetItem(#PLAYLIST,0,"")
Frame3DGadget(#B_PLAYLIST, 10, 10, 600, 51, "Playlist Manager")
ButtonGadget(#LOAD, 250, 30, 40, 20, "Load")
ButtonGadget(#SAVE, 560, 30, 40, 20, "Save")
TrackBarGadget(#PROGRESS, 190, 70, 370, 20, 0, 10000)
TrackBarGadget(#FADEIN, 190, 90, 370, 20, 0, 10000): SetGadgetState(#FADEIN,0)
TrackBarGadget(#FADEOUT, 190, 110, 370, 20, 0, 10000): SetGadgetState(#FADEOUT,10000)
TrackBarGadget(#VOLUME, 70, 75, 100, 15, 0, 100): SetGadgetState(#VOLUME,100)
TextGadget(#T_PROGRESS, 560, 70, 50, 20, "Progress")
TextGadget(#T_START, 560, 90, 50, 20, "FadeIn")
TextGadget(#T_STOP, 560, 110, 50, 20, "FadeOut")
TrackBarGadget(#BALANCE, 70, 115, 100, 15, 0, 200): SetGadgetState(#BALANCE,100)
StringGadget(#PLAYLIST_FILE, 300, 30, 250, 20, "")
Frame3DGadget(#B_TRACKLIST, 10, 53, 600, 95, "Track Manager")
Frame3DGadget(#B_TRACKLIST, 10, 140, 600, 190, "TrackList Manager")
ListViewGadget(#TRACKINFO, 420, 160, 180, 150): AddGadgetItem(#TRACKINFO,0,"");: AddGadgetColumn(#TRACKINFO,1,"Value",86)
ListViewGadget(#TRACKLIST, 40, 160,380,150)
TextGadget(#STATUS,550,312,55,12,"STATUS")
TextGadget(#HELP,10,330,600,50,"Hint")
If (LoadImage(#IMG_REW, "./icons/back.ico")): ButtonImageGadget(#REW, 30, 90, 20, 20, UseImage(#IMG_REW)): Else: ButtonGadget(#REW,30,90,20,20,"<<"): EndIf
If (LoadImage(#IMG_FWD, "./icons/fwd.ico")): ButtonImageGadget(#FF, 70, 90, 20, 20, UseImage(#IMG_FWD)): Else: ButtonGadget(#FF,70,90,20,20,">>"): EndIf
If (LoadImage(#IMG_PAUSE, "./icons/pause.ico")): ButtonImageGadget(#PAUSE, 140, 90, 20, 20, UseImage(#IMG_PAUSE)): Else: ButtonGadget(#PAUSE,140,90,20,20,"||"): EndIf
If (LoadImage(#IMG_PLAY, "./icons/play.ico")): ButtonImageGadget(#PLAY, 50, 90, 20, 20, UseImage(#IMG_PLAY)): Else: ButtonGadget(#PLAY,50,90,20,20,">"): EndIf
If (LoadImage(#IMG_STOP, "./icons/stop.ico")): ButtonImageGadget(#STOP, 120, 90, 20, 20, UseImage(#IMG_STOP)): Else: ButtonGadget(#STOP,120,90,20,20,"!"): EndIf
If (LoadImage(#IMG_REC, "./icons/record.ico")): ButtonImageGadget(#RECORD, 95, 90, 20, 20, UseImage(#IMG_REC)): Else: ButtonGadget(#RECORD,95,90,20,20,"O"): EndIf
If (LoadImage(#IMG_PREV, "./icons/prev.ico")): ButtonImageGadget(#PREV, 50, 70, 20, 20, UseImage(#IMG_PREV)): Else: ButtonGadget(#PREV,50,70,20,20,"A"): EndIf
If (LoadImage(#IMG_NEXT, "./icons/next.ico")): ButtonImageGadget(#NEXT, 50, 110, 20, 20, UseImage(#IMG_NEXT)): Else: ButtonGadget(#NEXT,50,110,20,20,"V"): EndIf
If (LoadImage(#IMG_DEL, "./icons/delete.ico")): ButtonImageGadget(#PL_DELTRK,16,160,20,20,UseImage(#IMG_DEL)): Else: ButtonGadget(#PL_DELTRK,16,160,20,20,"X"): EndIf
If (LoadImage(#IMG_MOVEUP, "./icons/prev.ico")): ButtonImageGadget(#PL_MOVEUP,16, 180, 20, 20, UseImage(#IMG_MOVEUP)): Else: ButtonGadget(#PL_MOVEUP,16,180,20,20,"A"): EndIf
If (LoadImage(#IMG_MOVEDN, "./icons/next.ico")): ButtonImageGadget(#PL_MOVEDN,16, 200, 20, 20, UseImage(#IMG_MOVEDN)): Else: ButtonGadget(#PL_MOVEDN,16,200,20,20,"V"): EndIf
If (LoadImage(#IMG_INSSTOP, "./icons/stop.ico")): ButtonImageGadget(#PL_STOP,16, 220, 20, 20, UseImage(#IMG_INSSTOP)): Else: ButtonGadget(#PL_STOP,16,220,20,20,"!"): EndIf
If (LoadImage(#IMG_DELALL, "./icons/delall.ico")): ButtonImageGadget(#DELALL,16, 240, 20, 20, UseImage(#IMG_DELALL)): Else: ButtonGadget(#DELALL, 16, 240, 20, 20, "*"): EndIf
EndIf
EndIf
EndProcedure
Procedure.s LoadPlayList()
HELP$="This Loads a PlayList - you can Load multiple MP3 files or single Play Lists, Multiple 'Loads' will append to the bottom of the existing 'PlayList'. Loading a *.M3U PlayList will also perform various FileChecks. Loading a *.PLY will not include the same Checks (but is faster), the *.PLY format allows you to include 'STOPS' in the PlayList."
_index=0
_pl$=OpenFileRequester("Load Playlist","C:\My Music\"+GetGadgetText(#PLAYLIST),"Load PlayList (*.ply)|*.ply|Import PlayList (*.m3u)|*.m3u|Import MP3 Files (*.mp3)|*.mp3" ,0, #PB_Requester_MultiSelection)
_seek=0
;- Load Tracks from M3U File
If (GetExtensionPart(_pl$)="m3u")
If (ReadFile(_file, _pl$))
SetGadgetText(#PLAYLIST_FILE,_pl$)
AddGadgetItem(#PLAYLIST,-1,_pl$)
Repeat:
_track$=ReadString():
If (FileSize(_track$)>1000): LoadMovie(1,_track$):
If (MovieLength()>0): _index=_index+1: AddGadgetItem(#TRACKLIST,-1,_track$): TRACKCTR=TRACKCTR+1: EndIf:
EndIf
Until Eof(_file)
AddGadgetItem(#TRACKLIST,-1," - END OF PLAYLIST -")
EndIf
EndIf
;-Load Tracks from PLY File
If (GetExtensionPart(_pl$)="ply")
If (ReadFile(_file, _pl$))
SetGadgetText(#PLAYLIST_FILE,_pl$)
AddGadgetItem(#PLAYLIST,-1,_pl$)
Repeat:
_track$=ReadString():
_index=_index+1: AddGadgetItem(#TRACKLIST,-1,_track$): TRACKCTR=TRACKCTR+1
Until Eof(_file)
EndIf
EndIf
;- Load Tracks from MP3 File(s)
If ( GetExtensionPart(_pl$)="mp3")
SetGadgetText(#PLAYLIST_FILE,"Multiple MP3 Selection")
_track$=_pl$
Repeat:
If (FileSize(_track$)>1000): LoadMovie(1,_track$): If (MovieLength()>0):
_index=_index+1: AddGadgetItem(#TRACKLIST, -1, _track$): TRACKCTR=TRACKCTR+1: EndIf: EndIf
_track$=NextSelectedFileName()
Until _track$=""
AddGadgetItem(#TRACKLIST,-1," - END OF PLAYLIST -")
EndIf
ProcedureReturn _pl$
EndProcedure
Procedure$ PlayTrack(_track$,_index)
_vol$=ReadINI(_track$,"VOL","100","./PlayerTracks.db")
_fadein$=ReadINI(_track$,"FADEIN","0","./PlayerTracks.db")
_fadeout$=ReadINI(_track$,"FADEOUT","10000","./PlayerTracks.db")
SetGadgetState(#VOLUME,Val(_vol$))
If (_track$=" - STOP -"): StopMovie(): ProcedureReturn("READY"): EndIf
If (IsFilename(_track$) Or FileSize(_track$)<1000 ): ProcedureReturn("BAD FILE"): EndIf
LoadMovie(1,_track$)
If (MovieLength()<0): ProcedureReturn("BAD FILE")
Else: SetGadgetState(#TRACKLIST,GetGadgetState(#TRACKLIST)): LoadMovie(1,_track$): PlayMovie(1,0)
SetGadgetState(#FADEIN,Val(_fadein$))
SetGadgetState(#FADEOUT,Val(_fadeout$))
MovieSeek(GetGadgetState(#FADEIN) * (MovieLength()/10000))
RemoveGadgetItem(#TRACKINFO,1): AddGadgetItem(#TRACKINFO,1,"FileName"+Space(10)+GetFilePart(_track$))
RemoveGadgetItem(#TRACKINFO,2): AddGadgetItem(#TRACKINFO,2,"FileSize "+Space(10)+Str(FileSize(_track$))+" Bytes")
RemoveGadgetItem(#TRACKINFO,3): AddGadgetItem(#TRACKINFO,3,"# Frames"+Space(10)+Str(MovieLength()/10000)+" Frames")
ProcedureReturn("PLAYING")
EndIf
EndProcedure
Procedure PL_MoveUp()
HELP$="While Reordering the TrackList, the Track continues to play but 'Progress' updates are frozen until you press 'Play' again"
_tmppos=GetGadgetState(#TRACKLIST): _tmpitem$=GetGadgetText(#TRACKLIST):
If (_tmppos>0):
RemoveGadgetItem(#TRACKLIST,GetGadgetState(#TRACKLIST)):
AddGadgetItem(#TRACKLIST,_tmppos-1,_tmpitem$):
SetGadgetState(#TRACKLIST,_tmppos-1)
EndIf
EndProcedure
Procedure PL_MoveDn()
HELP$="While Reordering the TrackList, the Track continues to play but 'Progress' updates are frozen until you press 'Play' again"
_tmppos=GetGadgetState(#TRACKLIST): _tmpitem$=GetGadgetText(#TRACKLIST):
If (_tmppos<TRACKCTR-1)
RemoveGadgetItem(#TRACKLIST,GetGadgetState(#TRACKLIST)):
AddGadgetItem(#TRACKLIST,_tmppos+1,_tmpitem$):
SetGadgetState(#TRACKLIST,_tmppos+1)
EndIf
EndProcedure
Procedure PL_Stop()
HELP$="You Inserted a 'STOP' into the TrackList - The Player will now stop once it reaches this point (until you select another track to play)"
_tmppos=GetGadgetState(#TRACKLIST):
AddGadgetItem(#TRACKLIST,_tmppos," - STOP -"):
TRACKCTR=TRACKCTR+1
SetGadgetState(#TRACKLIST,_tmppos):
EndProcedure
Procedure RecordTrackSettings(_track$,_vol,_fadein,_fadeout)
HELP$="This will record Volume & FadeIn / Fadeout positions to the 'PlayerTracks.db' file so your Track will start & stop at the right place and play at the right volume."
WriteINI(_track$,"VOL",Str(_vol),"./PlayerTracks.db")
WriteINI(_track$,"FADEIN",Str(_fadein),"./PlayerTracks.db")
ProcedureReturn WriteINI(_track$,"FADEOUT",Str(_fadeout),"./PlayerTracks.db")
EndProcedure
Procedure PL_DelTrk()
HELP$="This will clear a single track from the TrackList"
_track=GetGadgetState(#TRACKLIST): RemoveGadgetItem(#TRACKLIST,_track):
SetGadgetState(#TRACKLIST,_track):
TRACKCTR=TRACKCTR-1
EndProcedure
Procedure PL_DelAll()
HELP$="Selecting this option will clear the entire TrackList (but not the file)"
If (MessageRequester("Confirm","Are you sure you want to clear your tracklist?",#PB_MessageRequester_YesNo)=6):
Repeat:
RemoveGadgetItem(#TRACKLIST,0): TRACKCTR=TRACKCTR-1:
Until TRACKCTR<=-999:
TRACKCTR=0
SetGadgetState(#TRACKLIST,0)
EndIf:
EndProcedure
Procedure SavePlayList(_index)
HELP$="This will save your PlayList in the *.PLY format which may include any 'STOPS' you may have inserted into your PlayList"
_ext$=GetExtensionPart(GetGadgetText(#PLAYLIST_FILE))
_file$=ReplaceString(GetGadgetText(#PLAYLIST_FILE),_ext$,"ply",1)
If (_file$=""): _file$="Default.ply": EndIf
_file$=SaveFileRequester("Save PlayList File",_file$,"*.ply",1)
DeleteFile(_file$)
If (OpenFile(0,_file$))
_index=0
Repeat:
SetGadgetState(#TRACKLIST,_index)
_track$=GetGadgetText(#TRACKLIST): _index=_index+1
WriteStringN(_track$)
Until _index=TRACKCTR+1
CloseFile(0)
SetGadgetState(#TRACKLIST,_index)
EndIf
EndProcedure
;-MAIN#######################################
If (InitMovie()): Else: MessageRequester("Fatal Error","Can't Initialise Movie Player",1): EndIf
LOOPCTR=0
Open_Window_0()
AdvancedGadgetEvents(#TRUE)
STATUS$="READY": reps=0
_vol=100: bal=0
Repeat: EventID = WindowEvent(): Delay(#DELAY)
reps=reps+1
SetGadgetText(#STATUS,STATUS$)
If (STATUS$="PLAYING"); And reps=1)
RemoveGadgetItem(#TRACKINFO,4): AddGadgetItem(#TRACKINFO,4,"Position"+Space(10)+Str(MovieStatus()/10000))
RemoveGadgetItem(#TRACKINFO,5): AddGadgetItem(#TRACKINFO,5,"Fadein "+Space(10)+Str(GetGadgetState(#FADEIN)*(MovieLength()/10000)/10000))
RemoveGadgetItem(#TRACKINFO,6): AddGadgetItem(#TRACKINFO,6,"Fadeout"+Space(10)+Str(GetGadgetState(#FADEOUT) * (MovieLength()/10000)/10000))
RemoveGadgetItem(#TRACKINFO,7): AddGadgetItem(#TRACKINFO,7,"# Tracks"+Space(10)+Str(TRACKCTR))
SetGadgetState(#PROGRESS,MovieStatus()/(MovieLength()/10000)):
EndIf
If (reps=1): SetGadgetText(#STATUS,STATUS$) : EndIf
If (STATUS$="SEEK")
_divfactor.f=MovieLength()/10000
_seek.f=GetGadgetState(#PROGRESS)*_divfactor.f
RemoveGadgetItem(#TRACKINFO,4): AddGadgetItem(#TRACKINFO,4,"Position"+Space(10)+Str(MovieStatus()/10000)):
MovieSeek(_seek.f)
EndIf
If (GetGadgetState(#PROGRESS)>GetGadgetState(#FADEOUT)+1 And STATUS$<>"STOPPED" ); And reps=1):
_vol=_vol-1: MovieAudio(_vol,_bal): SetGadgetState(#VOLUME,_vol)
If (_vol=0):
_vol=100: SetGadgetState(#TRACKLIST,GetGadgetState(#TRACKLIST)+1): STATUS$=PlayTrack(GetGadgetText(#TRACKLIST),GetGadgetState(#TRACKLIST)):
EndIf
EndIf
If (GetGadgetState(#PROGRESS)>=9997)
SetGadgetState(#TRACKLIST,GetGadgetState(#TRACKLIST)+1): STATUS$=PlayTrack(GetGadgetText(#TRACKLIST),GetGadgetState(#TRACKLIST))
EndIf
If (GetGadgetText(#TRACKLIST)=" - END OF PLAYLIST -"): STATUS$="READY": StopMovie(): EndIf
If (reps>=300): reps=0: EndIf
If (GetGadgetState(#FADEIN)<0 Or GetGadgetState(#FADEOUT)<0): STATUS$="BAD FILE": EndIf
Select EventID:
Case #PB_EventGadget:
Select EventGadgetID():
Case #PLAYLIST: GID=0
Case #TRACKLIST: Select EventType():
Case #PB_EventType_LeftDoubleClick: STATUS$=PlayTrack(GetGadgetText(#TRACKLIST),GetGadgetState(#TRACKLIST))
EndSelect
Case #LOAD: PLAYLIST$=LoadPlayList()
Case #SAVE: SavePlayList(GetGadgetState(#TRACKLIST))
Case #DELALL: PL_DelAll():
Case #REW: MovieSeek(MovieStatus()-9999999): HELP$="Skipping Backwards a few seconds"
Case #FF: MovieSeek(MovieStatus()+9999999): HELP$="Skipping Forwards a few seconds"
Case #PAUSE: PauseMovie(): STATUS$="PAUSED": HELP$="You Paused the Track, Press 'Play' to resume"
Case #PLAY: Select STATUS$
Case "SEEK": STATUS$="RESUME"
Case "REORDER": STATUS$=PlayTrack(GetGadgetText(#TRACKLIST),GetGadgetState(#TRACKLIST))
Case "PAUSED" : ResumeMovie(): STATUS$="PLAYING"
Case "PLAYING": STATUS$=PlayTrack(GetGadgetText(#TRACKLIST),GetGadgetState(#TRACKLIST))
Case "STOPPED": STATUS$=PlayTrack(GetGadgetText(#TRACKLIST),GetGadgetState(#TRACKLIST))
Case "READY": STATUS$=PlayTrack(GetGadgetText(#TRACKLIST),GetGadgetState(#TRACKLIST))
EndSelect
HELP$="This Plays a Track - (unless you inserted a 'STOP') - ' - End Of PlayList -' markers are simply skipped"+Chr(13)+"If you previously paused a track, 'Play' will resume it. If you 'STOPPED' a track, this will restart it."
Case #STOP: StopMovie(): STATUS$="STOPPED": HELP$="You Stopped Playing the Track - Press 'PLAY' to Restart"
Case #PREV: SetGadgetState(#TRACKLIST,GetGadgetState(#TRACKLIST)-1): STATUS$=PlayTrack(GetGadgetText(#TRACKLIST),GetGadgetState(#TRACKLIST)): HELP$="Use this to skip back a track"
Case #NEXT: SetGadgetState(#TRACKLIST,GetGadgetState(#TRACKLIST)+1): STATUS$=PlayTrack(GetGadgetText(#TRACKLIST),GetGadgetState(#TRACKLIST)): HELP$="Use this to skip to the Next Track"
Case #PROGRESS: STATUS$="SEEK": HELP$="Use this to quickly skip forwards or backwards - press 'PLAY' to resume Playing"
Case #VOLUME: MovieAudio(GetGadgetState(#VOLUME), GetGadgetState(#BALANCE)-100): _vol=GetGadgetState(#VOLUME): HELP$="This is the Volume Control"
Case #BALANCE: MovieAudio(GetGadgetState(#VOLUME), GetGadgetState(#BALANCE)-100): _bal=GetGadgetState(#BALANCE)-100: HELP$="This is the Balance Control"
Case #PL_DELTRK: PL_DelTrk()
Case #PL_MOVEUP: OSTATUS$=STATUS$: PL_MoveUP(): STATUS$="REORDER"
Case #PL_MOVEDN: OSTATUS$=STATUS$: PL_MoveDn(): STATUS$="REORDER"
Case #PL_STOP: PL_Stop()
Case #RECORD: OSTATUS$=STATUS$: STATUS$="RECORD": SetGadgetText(#STATUS,STATUS$)
_result=RecordTrackSettings(GetGadgetText(#TRACKLIST),GetGadgetState(#VOLUME),GetGadgetState(#FADEIN),GetGadgetState(#FADEOUT))
Case #FADEIN: HELP$="This sets the Start Point for an individual track - If you press the 'RECORD' button, it will be stored in the 'PlayerTracks.db' file"
Case #FADEOUT: HELP$="This sets the FadeOut for an individual track - Once the Progress slider reaches the same point, it takes about 3 seconds to 'FadeOut' and move to the next track."+Chr(13)+"If you press the 'RECORD' button, it will be stored in the 'PlayerTracks.db' file"
Case #TRACKINFO: HELP$="This shows specific TrackInfo - Progress / Fadein / FadeOut stuff"
Case #TRACKLIST: HELP$="This is the TrackList - 'Reorder' / 'Delete' tracks or Insert a 'Stop' using the Buttons to the Left"
EndSelect
Case #PB_Event_Menu:; Do Nothing
Case #PB_Event_CloseWindow: Exit=1
Case #PB_Event_Repaint:; Do Nothing
Case #PB_Event_MoveWindow; Do Nothing
EndSelect
Delay(#DELAY)
Select STATUS$:
Case "RESUME": STATUS$=OSTATUS$:
Case "BAD FILE": SetGadgetText(#STATUS,STATUS$):
Delay(#DELAY*1): SetGadgetState(#TRACKLIST,GetGadgetState(#TRACKLIST)+1):
STATUS$=PlayTrack(GetGadgetText(#TRACKLIST),GetGadgetState(#TRACKLIST)):
Case "RECORD": Delay(#DELAY*30): STATUS$=OSTATUS$: SetGadgetText(#STATUS,STATUS$)
EndSelect
If (HELP$<>_ohelp$): SetGadgetText(#HELP,HELP$): EndIf: _ohelp$=HELP$
Until Exit=1