unit networkstream; interface uses bass,forms,global,windows,messages; procedure InitBassStreamPlayer(); function PlayURL(url: PAnsiChar): Integer; procedure stopStream(); procedure setStreamVolume(v : single); var chan: HSTREAM = 0; win : hwnd; const WM_INFO_UPDATE = WM_USER + 101; implementation uses jukeboxform,main; procedure InitBassStreamPlayer(); begin // check the correct BASS was loaded win := mainform.handle; if (HIWORD(BASS_GetVersion) <> BASSVERSION) then begin MessageBox(0, 'An incorrect version of BASS.DLL was loaded', nil, MB_ICONERROR); Halt; end; if (not BASS_Init(-1, 44100, 0, win, nil)) then begin //Error('Cant initialize device'); Halt; end; BASS_SetConfig(BASS_CONFIG_NET_PLAYLIST, 1); // enable playlist processing BASS_SetConfig(BASS_CONFIG_NET_PREBUF, 0); // minimize automatic pre-buffering, so we can do it (and display it) instead end; function PlayURL(url: PAnsiChar): Integer; var icy: PAnsiChar; Len, Progress: DWORD; begin Result := 0; BASS_StreamFree(chan); // close old stream progress := 0; chan := BASS_StreamCreateURL(url, 0, BASS_STREAM_BLOCK or BASS_STREAM_STATUS or BASS_STREAM_AUTOFREE, nil, nil); if (chan = 0) then begin //lets catch the error here inside the Thread // and send it to the WndProc result:=Bass_ErrorGetCode(); SendMessage(win, WM_INFO_UPDATE, 1, Bass_ErrorGetCode()); // Oops Error end else begin // Progress repeat len := BASS_StreamGetFilePosition(chan, BASS_FILEPOS_END); if (len = DW_Error) then break; // something's gone wrong! (eg. BASS_Free called) progress := BASS_StreamGetFilePosition(chan, BASS_FILEPOS_BUFFER) * 100 div len; // percentage of buffer filled SendMessage(win, WM_INFO_UPDATE, 2, progress); // show the Progess value in the label until (progress > 75) or (BASS_StreamGetFilePosition(chan, BASS_FILEPOS_CONNECTED) = 0); // over 75% full (or end of download) // get the broadcast name and bitrate icy := BASS_ChannelGetTags(chan, BASS_TAG_ICY); if (icy = nil) then icy := BASS_ChannelGetTags(chan, BASS_TAG_HTTP); // no ICY tags, try HTTP if (icy <> nil) then while (icy^ <> #0) do begin if (Copy(icy, 1, 9) = 'icy-name:') then //SendMessage(win, WM_INFO_UPDATE, 3, DWORD(PAnsiChar(Copy(icy, 10, MaxInt)))) jukebox.domessage('Now Streaming '+Copy(icy, 10, MaxInt); else if (Copy(icy, 1, 7) = 'icy-br:') then //SendMessage(win, WM_INFO_UPDATE, 4, DWORD(PAnsiChar('bitrate: ' + Copy(icy, 8, MaxInt)))); icy := icy + Length(icy) + 1; end; // get the stream title and set sync for subsequent titles //DoMeta(); //BASS_ChannelSetSync(chan, BASS_SYNC_META, 0, @MetaSync, nil); // play it! BASS_ChannelPlay(chan, FALSE); end; //cthread := 0; end; procedure stopStream(); begin BASS_StreamFree(chan); end; procedure setStreamVolume(v : single); begin BASS_SetVolume(v); end; end.