Code archives/Audio/Streaming sounds
This code has been declared by its author to be Public Domain code.
Download source code
| |||||
Small example to show how you can stream sounds (ie. play before the entire file is available, eg. while it is downloading from a website) Uses a file on your hard disk and slowly transfers it to a tempory file while playing Tested with .wav .mp3 and .ogg all worked with no problems Only problem is, if PlaySound reaches somewhere before its been copied over, the music will stop and can't be resumed from that point | |||||
;Title: Streaming sounds ;Version: 1.00 ;Author: David Blasdell (aka. King Dave) ; Email: admin@netcharger.co.uk ; Web: www.netcharger.co.uk or www.freeworldonline.co.uk ;Description: ; Example source code to demonstrate how to stream sound files using PlayMusic(filename$) ; (ie. playing the file before the entire file is downloaded) ; Transfers a file from somewhere on your hard disk to a tempory file, while it is playing ; Could be used to play music while it downloads off of a website ;Notes: ; If you enter too lower bytes per second value, the music may stop playing before the whole file is transfered Graphics 640,480,16,2 ;Set graphics to 640x480x16 window mode SetBuffer BackBuffer() ;Set buffer to back buffer SetFont LoadFont("Arial",14) ;Use Arial fsize 14 as the font filename$=Input$("Enter location of the file to be streamed: ") ;Get file to use (most things that can be played by PlayMusic() should work) bps=Int(Input$("Enter how many bytes to copy per second (eg. 10000): "))/4 ;Will transfer this number of bytes to the stream every second file_in=ReadFile(filename$) ;Read input file If Not file_in Then RuntimeError "Failed to read from '"+filename$+"'!" ;If failed to read from file, say so fsize=FileSize(filename$) ;Retrieve total fsize of file bytes=fsize ;Used to count down bytes left to read ;Retrieves file extension For a=Len(filename$) To 1 Step -1 If Mid$(filename$,a,1)="." Then ext$=Right$(filename$,Len(filename$)-a):Exit Next temp_file$=SystemProperty("tempdir")+"stream."+ext$ ;Create a tempory filename to use file_out=WriteFile(temp_file$) ;Write to a tempory file If Not file_out Then RuntimeError "Failed to write to '"+temp_file$+"'!" ;If failed to write to file, say so bank=CreateBank(bps*8) ;Create a bank big enough for 2xbps worth of bytes ReadBytes(bank,file_in,0,bps*8) ;Read bytes from input stream bytes=bytes-(bps*8) ;Reduce byte count WriteBytes(bank,file_out,0,bps*8) ;Write bytes to output stream (need a fair amount or bytes ready before starting PlayMusic(), this sends 2 seconds worth) ResizeBank(bank,bps) ;Reduce bank fsize to 1/4 of the bytes per second speed music=PlayMusic(temp_file$) ;Start playing the stream While ChannelPlaying(music)=1 ;Main loop, repeats while music is still playing If KeyHit(1) Then End ;End the program if escape is hit If stream_delay<MilliSecs() Then If Eof(file_in)=0 ;Every 250 milliseconds more data will be written to the output file If bytes<bps Then a=bytes Else a=bps ;Checks how much can be read ReadBytes(bank,file_in,0,a) ;Reads bytes from the input file WriteBytes(bank,file_out,0,a) ;Writes bytes to the output file bytes=bytes-a ;Subtracts amount moved from byte counter stream_delay=MilliSecs()+250 ;Waits for 250 milliseconds p#=100-((Float#(bytes)/Float#(fsize))*100) ;Calculates percentage of file sent DrawProgress("Streaming... ("+(fsize-bytes)+" of "+fsize+")",p#) ;Update screen Else If Not done Then DrawProgress("File fully transfered",100):done=1 ;Displays once the file has been fully transfered for playing EndIf Wend StopChannel music ;Stop music if still playing CloseFile file_in ;Close input file CloseFile file_out ;Close output file DeleteFile temp_file$ ;Delete the tempory file ;Works out wether the sound was fully played or not Cls Color 255,255,255 If bytes=0 Text 5,5,"Entire file was streamed succesfully" Else Text 5,5,"Only some of the file was streamed, try giving a higher bytes per second value" EndIf Flip FlushKeys() WaitKey End ;Draw a progress with description and percentage Function DrawProgress(t$,p#) w=GraphicsWidth() Cls Color 255,255,255 Text 2,2,t$ Color 255,0,0 Rect 9,20,w-18,16,0 Color 0,150,0 Rect 10,21,(p#/100)*(w-20),14,1 Color 0,0,255 Text w/2,28,Int(Floor#(p#))+"%",1,1 Flip 0 End Function |
Comments
None.
Code Archives Forum