Jump to content

Live Streaming


trancexx
 Share

Recommended Posts

@shanet, I will link your script as an example of usage from the first post if you replace ini file with registry entry and edit the header (since that script is clearly not written by me).

Yes, that is another way to do it, however I thought it would be easier to do a stations.ini file - also from a point of compatibility as I personally run it off my USB, however if someone wants to change it, or requests it changed, I as well as others will be happy to do that.

More stations:

http://89.238.146.240:9050    -- Doesnt work for me any more.
http://89.238.146.145:9050    -- Does work for me.
http://173.193.20.157:9020
(^Same broadcast^)

http://63.247.82.38:8000
http://87.230.84.182:6666

Trancexx, I have had further ideas as to the further development to my version, where they can do comments and names instead of the IP address.

shanet

Edited by shanet

[font="Comic Sans MS"]My code does not have bugs! It just develops random features.[/font]My Projects[list][*]Live Streaming (Not my project, but my edited version)[right]AutoIt Wrappers![/right][/list]Pure randomness[list][*]Small Minds.......................................................................................................[size="1"]Simple progress bar that changes direction at either sides.[/size][*]ChristmasIt AutoIt Christmas Theme..........................................................[size="1"]I WAS BOOOORED![/size][*]DriveToy..............................................................................................................[size="1"]Simple joke script. Trick your friends into thinking their computer drive is haywire![/size][/list]In Development[list][*]Your Background Task Organiser[*]AInstall Second Generation[/list]BEFORE POSTING ON THE FORUMS, TRY THIS:

%programfiles%/AutoIt3/autoit3.chm
Link to comment
Share on other sites

Sorry, I didn't notice that you had posted one?

However the GUI is screwed up.

And channel change doesn't work.

And I don't see any .ini file.

Also, your stop button does the same thing as the pause button.

Maybe the text in pause would make more sense as stop?

Anyway, that's enough of me killing your version, nice shot.

Look at mine?

shanet

gui was just a basic example.

channel change works well, you must stop playing before.

you don't see any ini file, that's why i said ini file or combobox.

stop button doesn't permit to continue the streaming that's why it's not a pause button.

You can find similar buttons in a media player ! Posted Image

Edit: I don't like ini file i prefer working with registry.

Edited by wakillon

AutoIt 3.3.14.2 X86 - SciTE 3.6.0WIN 8.1 X64 - Other Example Scripts

Link to comment
Share on other sites

I agree with shanet

Portability is a very big deal these days, and with a script, especially a simple one with no system integration - forget the registry. Use .INI or your own proprietary format to save stuff in, no matter what 'good coding practices' tell people. We don't need more bloat in the registry for simple things.

One huge benefit side to this mindset - if you reinstall an O/S, you can just copy over stuff like shanet's script from a 'PortableApps' folder - and you have a complete suite of tools that don't need installing or reconfiguring. (using a launcher like PStart would be all thats needed)

Anyway, regardless of all that - cool script!

I would also say its pretty obvious that one should say in the topic what the requirements are (AutoIt Object), but hey at least the 2nd.6th, 9th,12th.. etc. posts takes care of any confusion..

Link to comment
Share on other sites

Ascend4nt, I'm pretty confident one will likely run into problems with HD space and ini files before any problem caused by using registry. And I'm aware of the sizes of HDs nowdays.

I'm yet to see valid argument that would give advantage to ini files over using registry. That one about reinstalling the system isn't.

It's more than just good coding practices.

edit:

Well, you know how I like attention and stuff like that. It's all part of my master plan to...

P.S. don't tell anyone - for your eyes only

Edited by trancexx

♡♡♡

.

eMyvnE

Link to comment
Share on other sites

I couldn't help noticing this thread is rated 3 with too people voting. One rate is 4, other is ...well you calculate it.

If you have something against the thread starter that's perfectly ok, you can leave comment in their profile, or whatever. Rating is for the code. Learn not to abuse the system.

♡♡♡

.

eMyvnE

Link to comment
Share on other sites

Ascend4nt, I'm pretty confident one will likely run into problems with HD space and ini files before any problem caused by using registry. And I'm aware of the sizes of HDs nowdays.

I'm yet to see valid argument that would give advantage to ini files over using registry. That one about reinstalling the system isn't.

It's more than just good coding practices.

edit:

Well, you know how I like attention and stuff like that. It's all part of my master plan to...

P.S. don't tell anyone - for your eyes only

I dont really see how that is relevant, because:

1. How many stations do you want? A single stations.ini file would take all of 500 bytes?

However in the registry, it would take more space because it needs the registry path as well.

However I will do a registry one if you wish.

btw there's your rating :x

shanet

--EDIT--

Here it is, not finished, but it handles the registry instead of a .ini file. It still needs a bit of work, but its Christmas and I would like to spend today with my family.

It just needs an add button at the moment, which is not working so I have commented it out.

#AutoIt3Wrapper_AU3Check_Parameters=-d -w 1 -w 2 -w 3 -w 4 -w 5 -w 6
#AutoIt3Wrapper_Res_Description=Internet Radio!
#AutoIt3Wrapper_Res_Fileversion=2.0

;------LIVE STREAM PLAYER---------------------------------------;
;.......script written by trancexx (trancexx at yahoo dot com)..;
;.......and edited by shanet....................................;
;                                                               ;
;-------New Features                                            ;
; -- Close to tray                                              ;
;       You can now minimize to the taskbar, and close to the   ;
;       system tray!                                            ;
;       To exit, right click the tray icon and select exit.     ;
;       To show the GUI, double click the icon.                 ;
;                                                               ;
; -- Select station                                             ;
;       You can now change the station and add new stations!    ;
;       To change the station, choose the one you wish to change;
;       to and click change.                                    ;
;---------------------------------------------------------------;


#include <objects\AutoitObject.au3>
#include <ComboConstants.au3>
;#include <Popper.au3>

Opt("TrayMenuMode", 1)
Opt("MustDeclareVars", 1)

Global $sMediaFile, $stations
If RegRead("HKCU\Software\LiveStreaming", "stations") = "" Then
    RegWrite("HKCU\Software\LiveStreaming", "stations", "REG_SZ", "http://173.193.14.170:8012|http://94.76.208.7:8001|http://212.45.104.50:8050|http://119.207.75.238:11250|http://norway.discovertrance.com:8000|http://u15c.di.fm:80/di_minimal|http://scfire-dtc-aa01.stream.aol.com:80/stream/1003|http://ns24907.ovh.net:8000|http://63.247.82.38:8000|http://89.238.146.240:9050|http://87.230.84.182:6666")
    $stations = RegRead("HKCU\Software\LiveStreaming", "stations")
Else
    $stations = RegRead("HKCU\Software\LiveStreaming", "stations")
EndIf

$sMediaFile = StringSplit($stations, "|")
$sMediaFile = $sMediaFile[1]
$stations = StringReplace($stations, $sMediaFile & "|", "")

; Error monitoring
Global $oCOMError = ObjEvent("AutoIt.Error", "_ErrFunc")

; Let the magic begin...
_AutoItObject_StartUp()

; DLLs to use
Global $oUSER32DLL = _AutoItObject_DllOpen("user32.dll")

; GUI
Global $hGUI = GUICreate("Live Streaming", 258, 132)

Global $hVolSlider = GUICtrlCreateSlider(10, 14, 28, 64, 10 + 16)
GUICtrlSetTip(-1, "100 %VOL")
GUICtrlCreateLabel("VOL", 40, 21, 68, 20)
GUICtrlSetFont(-1, 9, -1, 2, "Curier New")

Global $hButtonPlay = GUICtrlCreateButton("&Pause", 80, 20, 115, 25)
Global $hLabelInfo = GUICtrlCreateLabel("  ...Connecting...", 90, 60, 130, 25)
GUICtrlSetFont(-1, 9, -1, 2, "Arial")
Global $hLevMet
Global $hStatSel = GUICtrlCreateCombo($sMediaFile, 20, 82, 222, 15, $CBS_DROPDOWNLIST)
GUICtrlSetData($hStatSel, $stations)
Global $min2tray = GUICtrlCreateCheckbox("Close to Tray", 173, 110)
GUICtrlSetState($min2tray, 1)
;Global $addBtn = GUICtrlCreateButton("Add Station", 5, 105)

; Tray
Global $trayinfo = 0
TraySetClick(16)

Global $traypaus = TrayCreateItem("Pause")
TrayItemSetState($traypaus, 4)
Global $trayexit = TrayCreateItem("Exit")
TrayItemSetState($trayexit, 4)


; Objects
Global $oGraphBuilder, $oMediaControl, $oBasicAudio, $oAudioMeterInformation

; Level-meter
_AudioVolObject($oAudioMeterInformation)
If Not @error Then ; if this objects are available on the system then add control for it
    $hLevMet = GUICtrlCreateProgress(220, 15, 20, 60, 4)
    AdlibRegister("_LevelMeter", 45)
EndIf

; Misc variables
Global $iPlaying = 1, $iVol

; Show GUI
GUISetState()


; Main loop
While 1

    Switch GUIGetMsg()
        Case $hStatSel
            GUICtrlSetFont($hLabelInfo, 9, -1, 2, "Arial")
            GUICtrlSetData($hLabelInfo, "...Connecting...")
            GUICtrlSetColor($hLabelInfo, 0x000000)
            $sMediaFile = GUICtrlRead($hStatSel)
;       Case $addBtn
;           _Add()
        Case -3
            Global $mintray
            $mintray = GUICtrlRead($min2tray)
            if $mintray = 1 Then
                if $trayinfo = 0 Then
                    $trayinfo = 1
                    MsgBox(0, "Close to Tray", "You have closed to the system tray." & @LF & "To show the GUI again, double click the tray icon." & @LF & "To exit, right click the tray icon and choose exit.")
                EndIf
                GUISetState(@SW_HIDE, $hGUI)
            Else
                ExitLoop
            EndIf

        Case $hButtonPlay
            If $iPlaying Then
                $oMediaControl.Pause()
                GUICtrlSetData($hButtonPlay, "&Play")
                TrayItemSetText($traypaus, "Play")
                TrayItemSetState($traypaus, 4)
                $iPlaying = 0
            Else
                $oMediaControl.Run()
                GUICtrlSetData($hButtonPlay, "&Pause")
                TrayItemSetText($traypaus, "Pause")
                TrayItemSetState($traypaus, 4)
                $iPlaying = 1
            EndIf
        EndSwitch

    Switch TrayGetMsg()
        Case $trayexit
            ExitLoop
        Case $traypaus
            If $iPlaying Then
                $oMediaControl.Pause()
                GUICtrlSetData($hButtonPlay, "&Play")
                $iPlaying = 0
            Else
                $oMediaControl.Run()
                GUICtrlSetData($hButtonPlay, "&Pause")
                $iPlaying = 1
            EndIf
        Case -13
            GUISetState(@SW_SHOW, $hGUI)
    EndSwitch
    If $iVol <> GUICtrlRead($hVolSlider) Then
        $iVol = GUICtrlRead($hVolSlider)
        If IsObj($oBasicAudio) Then $oBasicAudio.put_Volume(-Exp(0.65 * ($iVol * 1.4) / 10))    ; Only works between 0 and 65%. Default = 10.84
        GUICtrlSetTip($hVolSlider, 100 - $iVol & " %VOL")
    EndIf
    If $sMediaFile Then _RenderFile($sMediaFile)
WEnd

; Free before the end
_Quit()

;THE END

Func _Quit()
        AdlibUnRegister()
    ; Release objests
    _ReleaseBuilder($oGraphBuilder, $oMediaControl, $oBasicAudio)
    $oAudioMeterInformation = 0
    ; Bye bye
    Exit
EndFunc   ;==>_Quit

;-- Shane's Functions

;Func _Add()
;   Local $win2 = GUICreate("Add Station", 230, 80)
;   Local $newStation = GUICtrlCreateInput("", 40, 20, 160)
;   Global $submitStn = GUICtrlCreateButton("OK", 140, 50, 60)
;   GUISetState(@SW_SHOW, $win2)
;   While 1
;       If GUIGetMsg() = $sumbitStn Then
;           RegWrite("HKCU\Software\LiveStreaming", "stations", "REG_SZ", $stations & "|" & GUICtrlRead($newStation))
;           GUIDelete($win2)
;       EndIf
;   WEnd
;EndFunc ;==>_Add

;-- End of Shane's Functions

Func _LevelMeter()
    Local $aCall = $oAudioMeterInformation.GetPeakValue(0)
    If IsArray($aCall) Then
        Local $iCurrentRead = 100 * $aCall[1]
        GUICtrlSetData($hLevMet, $iCurrentRead + 1)
        GUICtrlSetData($hLevMet, $iCurrentRead)
    EndIf
EndFunc   ;==>_LevelMeter


Func _AudioVolObject(ByRef $oAudioMeterInformation)
    Local Const $sCLSID_MMDeviceEnumerator = "{BCDE0395-E52F-467C-8E3D-C4579291692E}"
    Local Const $sIID_IMMDeviceEnumerator = "{A95664D2-9614-4F35-A746-DE8DB63617E6}"
    Global $dtagIMMDeviceEnumerator = $dtagIUnknown & _
            "EnumAudioEndpoints hresult(dword;dword;ptr*);" & _
            "GetDefaultAudioEndpoint hresult(dword;dword;ptr*);" & _
            "GetDevice hresult(wstr;ptr*);" & _
            "RegisterEndpointNotificationCallback hresult(ptr);" & _
            "UnregisterEndpointNotificationCallback hresult(ptr);"

    Local $dtagIMMDevice = $dtagIUnknown & _
            "Activate hresult(ptr;dword;variant*;ptr*);" & _
            "OpenPropertyStore hresult(dword;ptr*);" & _
            "GetId hresult(wstr*);" & _
            "GetState hresult(dword*);"

    Local Const $sIID_IAudioMeterInformation = "{C02216F6-8C67-4B5B-9D00-D008E73E0064}"
    Local $dtagIAudioMeterInformation = $dtagIUnknown & _
            "GetPeakValue hresult(float*);" & _
            "GetMeteringChannelCount hresult(dword*);" & _
            "GetChannelsPeakValues hresult(dword;float*);" & _
            "QueryHardwareSupport hresult(dword*);"

    ; MMDeviceEnumerator
    Local $oMMDeviceEnumerator = _AutoItObject_ObjCreate($sCLSID_MMDeviceEnumerator, $sIID_IMMDeviceEnumerator, $dtagIMMDeviceEnumerator)
    If @error Then Return SetError(1, 0, 0)

    ; DefaultAudioEndpoint
    Local $aCall = $oMMDeviceEnumerator.GetDefaultAudioEndpoint(0, 0, 0) ; eRender, eConsole
    If Not IsArray($aCall) Then Return SetError(2, 0, 0)
    Local $oDefaultDevice = _AutoItObject_WrapperCreate($aCall[3], $dtagIMMDevice)

    ; AudioMeterInformation
    Local $pIID_IAudioMeterInformation = _AutoItObject_CLSIDFromString($sIID_IAudioMeterInformation)
    $aCall = $oDefaultDevice.Activate(Number(DllStructGetPtr($pIID_IAudioMeterInformation)), 1, 0, 0)
    If Not IsArray($aCall) Then Return SetError(3, 0, 0)
    $oAudioMeterInformation = _AutoItObject_WrapperCreate($aCall[4], $dtagIAudioMeterInformation)

    ; That's it
    Return True
EndFunc   ;==>_AudioVolObject

Func _InitBuilder(ByRef $oGraphBuilder, ByRef $oMediaControl, ByRef $oBasicAudio)
    ; Needed identifiera
    Local $sCLSID_FilterGraph = "{E436EBB3-524F-11CE-9F53-0020AF0BA770}"
    Local $sIID_IGraphBuilder = "{56A868A9-0AD4-11CE-B03A-0020AF0BA770}"
    ; More...
    Local $tIID_IMediaControl = _AutoItObject_CLSIDFromString("{56A868B1-0AD4-11CE-B03A-0020AF0BA770}")
    Local $tIID_IBasicAudio = _AutoItObject_CLSIDFromString("{56A868B3-0AD4-11CE-B03A-0020AF0BA770}")

    ; Define IGraphBuilder methods
    Local $dtagIGraphBuilder = $dtagIUnknown & _
            "AddFilter hresult(ptr;wstr);" & _
            "RemoveFilter hresult(ptr);" & _
            "EnumFilters hresult(ptr*);" & _
            "FindFilterByName hresult(wstr;ptr*);" & _
            "ConnectDirect hresult(ptr;ptr;ptr);" & _
            "Reconnect hresult(ptr);" & _
            "Disconnect hresult(ptr);" & _
            "SetDefaultSyncSource hresult();" & _ ; IFilterGraph
            "Connect hresult(ptr;ptr);" & _
            "Render hresult(ptr);" & _
            "RenderFile hresult(wstr;ptr);" & _
            "AddSourceFilter hresult(wstr;wstr;ptr*);" & _
            "SetLogFile hresult(dword_ptr);" & _
            "Abort hresult();" & _
            "ShouldOperationContinue hresult();" ; IGraphBuilder

    ; Wrapp IGraphBuilder interface
    $oGraphBuilder = _AutoItObject_ObjCreate($sCLSID_FilterGraph, $sIID_IGraphBuilder, $dtagIGraphBuilder)
    If @error Then Return SetError(1, 0, False)

    ; IMediaControl IDispatch
    Local $aCall = $oGraphBuilder.QueryInterface(Number(DllStructGetPtr($tIID_IMediaControl)), 0)
    If IsArray($aCall) And $aCall[2] Then
        $oMediaControl = _AutoItObject_PtrToIDispatch($aCall[2])
    Else
        Return SetError(2, 0, False)
    EndIf

    Local $pBasicAudio
    ; Get pointer to IBasicAudio interface
    $aCall = $oGraphBuilder.QueryInterface(Number(DllStructGetPtr($tIID_IBasicAudio)), 0)
    If IsArray($aCall) And $aCall[2] Then
        $pBasicAudio = $aCall[2]
    Else
        Return SetError(3, 0, False)
    EndIf

    ; IBasicAudio is dual interface. Defining vTable methods:
    Local $dtagIBasicAudio = $dtagIDispatch & _
            "put_Volume hresult(long);" & _
            "get_Volume hresult(long*);" & _
            "put_Balance hresult(long);" & _
            "get_Balance hresult(long*);" ; IBasicAudio

    ; Wrapp it:
    $oBasicAudio = _AutoItObject_WrapperCreate($pBasicAudio, $dtagIBasicAudio)
    If @error Then Return SetError(4, 0, False)

    Return True ; There
EndFunc   ;==>_InitBuilder

Func _ReleaseBuilder(ByRef $oGraphBuilder, ByRef $oMediaControl, ByRef $oBasicAudio)
    $oMediaControl.Stop()
    $oBasicAudio = 0
    $oMediaControl = 0
    $oGraphBuilder.Release() ;<-!
    $oGraphBuilder = 0
EndFunc   ;==>_ReleaseBuilder

Func _RenderFile(ByRef $sMediaFile)
    _ReleaseBuilder($oGraphBuilder, $oMediaControl, $oBasicAudio)
    _InitBuilder($oGraphBuilder, $oMediaControl, $oBasicAudio)
    If Not _WMAsfReaderLoad($sMediaFile) Then
        $oUSER32DLL.MessageBeep("int", "dword", 48)
        $sMediaFile = ""
        Return SetError(1, 0, False)
    EndIf
    $oCOMError.number = 0 ; set no-error condition
    $oMediaControl.Run()
    ; Check for error
    If $oCOMError.number Then
;       GUISetState(@SW_SHOW, $hGUI)
        GUICtrlSetFont($hLabelInfo, 9, -1, 1, "Arial")
        GUICtrlSetData($hLabelInfo, "Streaming failed")
        GUICtrlSetColor($hLabelInfo, 0xFF0000)
        MsgBox(48, "Error", "Failed to stream", 0, $hGUI)
    Else
        GUICtrlSetFont($hLabelInfo, 9, -1, 1, "Arial")
        GUICtrlSetData($hLabelInfo, "    Connected!")
    EndIf
    $sMediaFile = ""
    Return True
EndFunc   ;==>_RenderFile

Func _WMAsfReaderLoad($sFile)
    Local Const $sCLSID_WMAsfReader = "{187463A0-5BB7-11d3-ACBE-0080C75E246E}"
    ; IBaseFilter definition
    Local Const $sIID_IBaseFilter = "{56a86895-0ad4-11ce-b03a-0020af0ba770}"
    Local $dtagIBaseFilter = $dtagIUnknown & _
            "GetClassID hresult(ptr*);" & _; IPersist
            "Stop hresult();" & _
            "Pause hresult();" & _
            "Run hresult(int64);" & _
            "GetState hresult(dword;dword*);" & _
            "SetSyncSource hresult(ptr);" & _
            "GetSyncSource hresult(ptr*);" & _ ; IMediaFilter
            "EnumPins hresult(ptr*);" & _
            "FindPin hresult(wstr;ptr*);" & _
            "QueryFilterInfo hresult(ptr*);" & _
            "JoinFilterGraph hresult(ptr;wstr);" & _
            "QueryVendorInfo hresult(wstr*);" ; IBaseFilter
    ; Create object
    Local $oBaseFilter = _AutoItObject_ObjCreate($sCLSID_WMAsfReader, $sIID_IBaseFilter, $dtagIBaseFilter)
    If @error Then Return SetError(1, 0, False)
    ; AddFilter is "must" to be able to use it
    $oGraphBuilder.AddFilter($oBaseFilter.__ptr__, "anything")

    ; File will be loaded using FileSourceFilter object
    ; IFileSourceFilter definition
    Local Const $sIID_IFileSourceFilter = "{56a868a6-0ad4-11ce-b03a-0020af0ba770}"
    Local $dtagIFileSourceFilter = $dtagIUnknown & _
            "Load hresult(wstr;ptr);" & _
            "GetCurFile hresult(ptr*;ptr);"

    Local $tIID_IFileSourceFilter = _AutoItObject_CLSIDFromString($sIID_IFileSourceFilter)
    ; Ask for FileSourceFilter object from BaseFilter
    Local $aCall = $oBaseFilter.QueryInterface(Number(DllStructGetPtr($tIID_IFileSourceFilter)), 0)
    If Not IsArray($aCall) Then Return SetError(2, 0, False)
    ; Wrapp it
    Local $oFileSourceFilter = _AutoItObject_WrapperCreate($aCall[2], $dtagIFileSourceFilter)

    ; Load the file now
    $oFileSourceFilter.Load($sFile, 0)

    $aCall = $oFileSourceFilter.GetCurFile(0, 0)
    Local $pFile = $aCall[1]
    Local $sLoaded = DllStructGetData(DllStructCreate("wchar[" & __Au3Obj_PtrStringLen($pFile) + 1 & "]", $pFile), 1)
    __Au3Obj_CoTaskMemFree($pFile)
    ConsoleWrite($sLoaded & @CRLF)

    ; Get pointer to EnumPins object
    $aCall = $oBaseFilter.EnumPins(0)
    If Not IsArray($aCall) Or Not $aCall[1] Then Return SetError(3, 0, False)
    Local $pEnum = $aCall[1]

    ; Define IEnumPins methods
    Local $dtagIEnumPins = $dtagIUnknown & _
            "Next hresult(dword;ptr*;dword*);" & _
            "Skip hresult(dword);" & _
            "Reset hresult();" & _
            "Clone hresult(ptr*);"
    ; Wrapp it
    Local $oEnum = _AutoItObject_WrapperCreate($pEnum, $dtagIEnumPins)

    ; Will enumerate all PINs and render them
    Local $pPin
    While 1
        $aCall = $oEnum.Next(1, 0, 0)
        If Not IsArray($aCall) Then Return SetError(4, 0, False)
        $pPin = $aCall[2]
        If $pPin Then
            $oGraphBuilder.Render($pPin)
            _AutoItObject_IUnknownRelease($pPin); releasing non-wrapped object when no longer needed
        EndIf
        If $aCall[0] Then ExitLoop
    WEnd

    ; All's ok
    Return True
EndFunc   ;==>_WMAsfReaderLoad


Func _ErrFunc()
;~  ConsoleWrite("! COM Error !  Number: 0x" & Hex($oCOMError.number, 8) & "   ScriptLine: " & $oCOMError.scriptline & " - " & $oCOMError.windescription & @CRLF)
EndFunc   ;==>_ErrFunc

shanet

Edited by shanet

[font="Comic Sans MS"]My code does not have bugs! It just develops random features.[/font]My Projects[list][*]Live Streaming (Not my project, but my edited version)[right]AutoIt Wrappers![/right][/list]Pure randomness[list][*]Small Minds.......................................................................................................[size="1"]Simple progress bar that changes direction at either sides.[/size][*]ChristmasIt AutoIt Christmas Theme..........................................................[size="1"]I WAS BOOOORED![/size][*]DriveToy..............................................................................................................[size="1"]Simple joke script. Trick your friends into thinking their computer drive is haywire![/size][/list]In Development[list][*]Your Background Task Organiser[*]AInstall Second Generation[/list]BEFORE POSTING ON THE FORUMS, TRY THIS:

%programfiles%/AutoIt3/autoit3.chm
Link to comment
Share on other sites

I dont really see how that is relevant, because:

1. How many stations do you want? A single stations.ini file would take all of 500 bytes?

However in the registry, it would take more space because it needs the registry path as well.

However I will do a registry one if you wish.

btw there's your rating :x

shanet

Find some literature on Windows Registry and Windows NT. You will be much smarter afterwards, I promise.

What I wish shouldn't matter for you.

Yes, rating. How would you explain it?

♡♡♡

.

eMyvnE

Link to comment
Share on other sites

When you wish upon golden stars.. lol. What is it with people's obsession over ratings? I think all your fussing about it isn't making a good case for anyone to give your script more, trancexx. But hey, here's 5 sticky stars for you. You can put them up on your wall and remember your script made it all happen.

Posted Image

Link to comment
Share on other sites

When you wish upon golden stars.. lol. What is it with people's obsession over ratings? I think all your fussing about it isn't making a good case for anyone to give your script more, trancexx. But hey, here's 5 sticky stars for you. You can put them up on your wall and remember your script made it all happen.

Posted Image

My obsession are deviations.

This thread is pure gold from more than one point of view. Exquisite.

...And too easy.

♡♡♡

.

eMyvnE

Link to comment
Share on other sites

Well, I have done a few more things.

Here is the new version of the LiveStreaming that handles stations.ini, now with the add a station function. Also, handling of stations is now in an extension of the GUI... dont ask, just download!

Thanks Melba23 for the GUIExtensions UDF, trancexx for the original software, my default station for playing two different songs from my fav band whilst I was testing the application, and you guys for using it!

Source Code and Notes:

Non-Registry (stations.ini)

#Region ;**** Directives created by AutoIt3Wrapper_GUI ****
#AutoIt3Wrapper_icon=irate_radio.ico
#AutoIt3Wrapper_outfile=LiveStreaming.exe
#AutoIt3Wrapper_Res_Description=Internet Radio!
#AutoIt3Wrapper_Res_Fileversion=2.1.0.0
;#AutoIt3Wrapper_Run_AU3Check=n
#EndRegion ;**** Directives created by AutoIt3Wrapper_GUI ****
;#AutoIt3Wrapper_AU3Check_Parameters=-d -w 1 -w 2 -w 3 -w 4 -w 5 -w 6

;------LIVE STREAM PLAYER-v2------------------------------------;
;.......script written by trancexx (trancexx at yahoo dot com)..;
;.......and edited by shanet....................................;
;                                                               ;
;-------New Features                                            ;
; -- Close to tray                                              ;
;       You can now minimize to the taskbar, and close to the   ;
;       system tray!                                            ;
;       To exit, right click the tray icon and select exit.     ;
;       To show the GUI, double click the icon.                 ;
;                                                               ;
; -- Select station                                             ;
;       You can now change the station and add new stations!    ;
;       To change the station, choose the one you wish to change;
;       to and click change.                                    ;
;       To add a new station, input the site into stations.ini  ;
;       as a new line.                                          ;
;---------------------------------------------------------------;


#include <objects\AutoitObject.au3>
#include <ComboConstants.au3>
#include <GUIExtender.au3>

Opt("TrayMenuMode", 1)
;Opt("MustDeclareVars", 1)

Global $sMediaFile = FileReadLine("stations.ini", 1) ; any other. Pay attention to format

Global $stations = FileRead("stations.ini")
$stations = StringReplace(FileRead("stations.ini"), @CRLF, "|")
$stations = StringReplace($stations, "//*|", "|")
$stations = StringReplace($stations, $sMediaFile & "|", "")

; Error monitoring
Global $oCOMError = ObjEvent("AutoIt.Error", "_ErrFunc")

; Let the magic begin...
_AutoItObject_StartUp()

; DLLs to use
Global $oUSER32DLL = _AutoItObject_DllOpen("user32.dll")

; GUI
Global $hGUI = GUICreate("Live Streaming", 258, 107)

_GUIExtender_Init($hGUI)                                                                ;Used for the extendable stations controls

Global $hVolSlider = GUICtrlCreateSlider(10, 14, 28, 64, 10 + 16)
GUICtrlSetTip(-1, "100 %VOL")
GUICtrlCreateLabel("VOL", 40, 21, 68, 20)
GUICtrlSetFont(-1, 9, -1, 2, "Curier New")

Global $hButtonPlay = GUICtrlCreateButton("&Pause", 80, 20, 115, 25)
Global $hLabelInfo = GUICtrlCreateLabel("  ...Connecting...", 90, 60, 130, 25)
GUICtrlSetFont(-1, 9, -1, 2, "Arial")
Global $hLevMet
Global $hButtonExtend = GUICtrlCreateButton(" â–¼ ", 5, 77)
Global $hCheckboxTray = GUICtrlCreateCheckbox("Close to Tray", 173, 82)
GUICtrlSetState($hCheckboxTray, 1)

;Retractable controls
Global $stationsExtender = _GUIExtender_Section_Start(107, 60)                          ;Starts the extendable controls
Global $hStatSel = GUICtrlCreateCombo($sMediaFile, 20, 110, 222, 15, $CBS_DROPDOWNLIST)
GUICtrlSetData($hStatSel, $stations)
Global $hButtonAddStation = GUICtrlCreateButton("Add Station", 5, 135, 65)
Global $hInputAddStation = GUICtrlCreateInput("New Station", 75, 135, 175)


_GUIExtender_Section_End()
; Tray
Global $trayinfo = 0
TraySetClick(16)

Global $traypaus = TrayCreateItem("Pause")
TrayItemSetState($traypaus, 4)
Global $trayexit = TrayCreateItem("Exit")
TrayItemSetState($trayexit, 4)


; Objects
Global $oGraphBuilder, $oMediaControl, $oBasicAudio, $oAudioMeterInformation

; Level-meter
_AudioVolObject($oAudioMeterInformation)
If Not @error Then ; if this objects are available on the system then add control for it
    $hLevMet = GUICtrlCreateProgress(220, 15, 20, 60, 4)
    AdlibRegister("_LevelMeter", 45)
EndIf

; Misc variables
Global $iPlaying = 1, $iVol

; Show GUI
GUISetState()


; Main loop
While 1

    Switch GUIGetMsg()
        Case $hStatSel
            GUICtrlSetFont($hLabelInfo, 9, -1, 2, "Arial")
            GUICtrlSetData($hLabelInfo, "...Connecting...")
            GUICtrlSetColor($hLabelInfo, 0x000000)
            $sMediaFile = GUICtrlRead($hStatSel)
        Case $hButtonExtend
;           MsgBox(0, "Coming Soon...", "This option is not yet implemented. It is coming soon." & @CRLF & "Besides, there is nothing there anyway... yet...")
            if _GUIExtender_Section_State($stationsExtender) = 1 Then
                _GUIExtender_Section_Extend($stationsExtender, False)
                GUICtrlSetData($hButtonExtend, " â–¼ ")
            Else
                _GUIExtender_Section_Extend($stationsExtender, True)
                GUICtrlSetData($hButtonExtend, " â–² ")
            EndIf
        Case -3
            Global $mintray
            $mintray = GUICtrlRead($hCheckboxTray)
            if $mintray = 1 Then
                if $trayinfo = 0 Then
                    $trayinfo = 1
                    MsgBox(0, "Close to Tray", "You have closed to the system tray." & @LF & "To show the GUI again, double click the tray icon." & @LF & "To exit, right click the tray icon and choose exit.")
                EndIf

                if _GUIExtender_Section_State($stationsExtender) = 1 Then
                    _GUIExtender_Section_Extend($stationsExtender, False)
                    GUICtrlSetData($hButtonExtend, " â–¼ ")
                EndIf
                GUISetState(@SW_HIDE, $hGUI)
            Else
                ExitLoop
            EndIf
        Case $hButtonAddStation
            Global $newStation = GUICtrlRead($hInputAddStation)
            If StringInStr($newStation, "http://") Then
                $newStation = StringReplace($newStation, "http://", "")
                MsgBox(0, "", "Removed http")
            EndIf
            If StringInStr($newStation, ":") = 0 Then
                MsgBox(0, "ERROR", "Please include a port!")
            Else
                FileWrite("stations.ini", @CRLF & "http://" & $newStation)
            EndIf
        Case $hButtonPlay
            If $iPlaying Then
                $oMediaControl.Pause()
                GUICtrlSetData($hButtonPlay, "&Play")
                TrayItemSetText($traypaus, "Play")
                TrayItemSetState($traypaus, 4)
                $iPlaying = 0
            Else
                $oMediaControl.Run()
                GUICtrlSetData($hButtonPlay, "&Pause")
                TrayItemSetText($traypaus, "Pause")
                TrayItemSetState($traypaus, 4)
                $iPlaying = 1
            EndIf
        EndSwitch

    Switch TrayGetMsg()
        Case $trayexit
            ExitLoop
        Case $traypaus
            If $iPlaying Then
                $oMediaControl.Pause()
                GUICtrlSetData($hButtonPlay, "&Play")
                $iPlaying = 0
            Else
                $oMediaControl.Run()
                GUICtrlSetData($hButtonPlay, "&Pause")
                $iPlaying = 1
            EndIf
        Case -13
            GUISetState(@SW_SHOW, $hGUI)
    EndSwitch
    If $iVol <> GUICtrlRead($hVolSlider) Then
        $iVol = GUICtrlRead($hVolSlider)
        If IsObj($oBasicAudio) Then $oBasicAudio.put_Volume(-Exp(0.65 * ($iVol * 1.4) / 10))    ; Only works between 0 and 65%. Default line:       If IsObj($oBasicAudio) Then $oBasicAudio.put_Volume(-Exp(0.65 * ($iVol) / 10.84))
        GUICtrlSetTip($hVolSlider, 100 - $iVol & " %VOL")
    EndIf
    If $sMediaFile Then _RenderFile($sMediaFile)
WEnd

; Free before the end
_Quit()

;THE END

Func _Quit()
    AdlibUnRegister()
    ; Release objests
    _ReleaseBuilder($oGraphBuilder, $oMediaControl, $oBasicAudio)
    $oAudioMeterInformation = 0
    ; Bye bye
    Exit
EndFunc   ;==>_Quit

Func _LevelMeter()
    Local $aCall = $oAudioMeterInformation.GetPeakValue(0)
    If IsArray($aCall) Then
        Local $iCurrentRead = 100 * $aCall[1]
        GUICtrlSetData($hLevMet, $iCurrentRead + 1)
        GUICtrlSetData($hLevMet, $iCurrentRead)
    EndIf
EndFunc   ;==>_LevelMeter


Func _AudioVolObject(ByRef $oAudioMeterInformation)
    Local Const $sCLSID_MMDeviceEnumerator = "{BCDE0395-E52F-467C-8E3D-C4579291692E}"
    Local Const $sIID_IMMDeviceEnumerator = "{A95664D2-9614-4F35-A746-DE8DB63617E6}"
    Global $dtagIMMDeviceEnumerator = $dtagIUnknown & _
            "EnumAudioEndpoints hresult(dword;dword;ptr*);" & _
            "GetDefaultAudioEndpoint hresult(dword;dword;ptr*);" & _
            "GetDevice hresult(wstr;ptr*);" & _
            "RegisterEndpointNotificationCallback hresult(ptr);" & _
            "UnregisterEndpointNotificationCallback hresult(ptr);"

    Local $dtagIMMDevice = $dtagIUnknown & _
            "Activate hresult(ptr;dword;variant*;ptr*);" & _
            "OpenPropertyStore hresult(dword;ptr*);" & _
            "GetId hresult(wstr*);" & _
            "GetState hresult(dword*);"

    Local Const $sIID_IAudioMeterInformation = "{C02216F6-8C67-4B5B-9D00-D008E73E0064}"
    Local $dtagIAudioMeterInformation = $dtagIUnknown & _
            "GetPeakValue hresult(float*);" & _
            "GetMeteringChannelCount hresult(dword*);" & _
            "GetChannelsPeakValues hresult(dword;float*);" & _
            "QueryHardwareSupport hresult(dword*);"

    ; MMDeviceEnumerator
    Local $oMMDeviceEnumerator = _AutoItObject_ObjCreate($sCLSID_MMDeviceEnumerator, $sIID_IMMDeviceEnumerator, $dtagIMMDeviceEnumerator)
    If @error Then Return SetError(1, 0, 0)

    ; DefaultAudioEndpoint
    Local $aCall = $oMMDeviceEnumerator.GetDefaultAudioEndpoint(0, 0, 0) ; eRender, eConsole
    If Not IsArray($aCall) Then Return SetError(2, 0, 0)
    Local $oDefaultDevice = _AutoItObject_WrapperCreate($aCall[3], $dtagIMMDevice)

    ; AudioMeterInformation
    Local $pIID_IAudioMeterInformation = _AutoItObject_CLSIDFromString($sIID_IAudioMeterInformation)
    $aCall = $oDefaultDevice.Activate(Number(DllStructGetPtr($pIID_IAudioMeterInformation)), 1, 0, 0)
    If Not IsArray($aCall) Then Return SetError(3, 0, 0)
    $oAudioMeterInformation = _AutoItObject_WrapperCreate($aCall[4], $dtagIAudioMeterInformation)

    ; That's it
    Return True
EndFunc   ;==>_AudioVolObject

Func _InitBuilder(ByRef $oGraphBuilder, ByRef $oMediaControl, ByRef $oBasicAudio)
    ; Needed identifiera
    Local $sCLSID_FilterGraph = "{E436EBB3-524F-11CE-9F53-0020AF0BA770}"
    Local $sIID_IGraphBuilder = "{56A868A9-0AD4-11CE-B03A-0020AF0BA770}"
    ; More...
    Local $tIID_IMediaControl = _AutoItObject_CLSIDFromString("{56A868B1-0AD4-11CE-B03A-0020AF0BA770}")
    Local $tIID_IBasicAudio = _AutoItObject_CLSIDFromString("{56A868B3-0AD4-11CE-B03A-0020AF0BA770}")

    ; Define IGraphBuilder methods
    Local $dtagIGraphBuilder = $dtagIUnknown & _
            "AddFilter hresult(ptr;wstr);" & _
            "RemoveFilter hresult(ptr);" & _
            "EnumFilters hresult(ptr*);" & _
            "FindFilterByName hresult(wstr;ptr*);" & _
            "ConnectDirect hresult(ptr;ptr;ptr);" & _
            "Reconnect hresult(ptr);" & _
            "Disconnect hresult(ptr);" & _
            "SetDefaultSyncSource hresult();" & _ ; IFilterGraph
            "Connect hresult(ptr;ptr);" & _
            "Render hresult(ptr);" & _
            "RenderFile hresult(wstr;ptr);" & _
            "AddSourceFilter hresult(wstr;wstr;ptr*);" & _
            "SetLogFile hresult(dword_ptr);" & _
            "Abort hresult();" & _
            "ShouldOperationContinue hresult();" ; IGraphBuilder

    ; Wrapp IGraphBuilder interface
    $oGraphBuilder = _AutoItObject_ObjCreate($sCLSID_FilterGraph, $sIID_IGraphBuilder, $dtagIGraphBuilder)
    If @error Then Return SetError(1, 0, False)

    ; IMediaControl IDispatch
    Local $aCall = $oGraphBuilder.QueryInterface(Number(DllStructGetPtr($tIID_IMediaControl)), 0)
    If IsArray($aCall) And $aCall[2] Then
        $oMediaControl = _AutoItObject_PtrToIDispatch($aCall[2])
    Else
        Return SetError(2, 0, False)
    EndIf

    Local $pBasicAudio
    ; Get pointer to IBasicAudio interface
    $aCall = $oGraphBuilder.QueryInterface(Number(DllStructGetPtr($tIID_IBasicAudio)), 0)
    If IsArray($aCall) And $aCall[2] Then
        $pBasicAudio = $aCall[2]
    Else
        Return SetError(3, 0, False)
    EndIf

    ; IBasicAudio is dual interface. Defining vTable methods:
    Local $dtagIBasicAudio = $dtagIDispatch & _
            "put_Volume hresult(long);" & _
            "get_Volume hresult(long*);" & _
            "put_Balance hresult(long);" & _
            "get_Balance hresult(long*);" ; IBasicAudio

    ; Wrapp it:
    $oBasicAudio = _AutoItObject_WrapperCreate($pBasicAudio, $dtagIBasicAudio)
    If @error Then Return SetError(4, 0, False)

    Return True ; There
EndFunc   ;==>_InitBuilder

Func _ReleaseBuilder(ByRef $oGraphBuilder, ByRef $oMediaControl, ByRef $oBasicAudio)
    $oMediaControl.Stop()
    $oBasicAudio = 0
    $oMediaControl = 0
    $oGraphBuilder.Release() ;<-!
    $oGraphBuilder = 0
EndFunc   ;==>_ReleaseBuilder

Func _RenderFile(ByRef $sMediaFile)
    _ReleaseBuilder($oGraphBuilder, $oMediaControl, $oBasicAudio)
    _InitBuilder($oGraphBuilder, $oMediaControl, $oBasicAudio)
    If Not _WMAsfReaderLoad($sMediaFile) Then
        $oUSER32DLL.MessageBeep("int", "dword", 48)
        $sMediaFile = ""
        Return SetError(1, 0, False)
    EndIf
    $oCOMError.number = 0 ; set no-error condition
    $oMediaControl.Run()
    ; Check for error
    If $oCOMError.number Then
;       GUISetState(@SW_SHOW, $hGUI)
        GUICtrlSetFont($hLabelInfo, 9, -1, 1, "Arial")
        GUICtrlSetData($hLabelInfo, "Streaming failed")
        GUICtrlSetColor($hLabelInfo, 0xFF0000)
        MsgBox(48, "Error", "Failed to stream", 0, $hGUI)
    Else
        GUICtrlSetFont($hLabelInfo, 9, -1, 1, "Arial")
        GUICtrlSetData($hLabelInfo, "    Connected!")
    EndIf
    $sMediaFile = ""
    Return True
EndFunc   ;==>_RenderFile

Func _WMAsfReaderLoad($sFile)
    Local Const $sCLSID_WMAsfReader = "{187463A0-5BB7-11d3-ACBE-0080C75E246E}"
    ; IBaseFilter definition
    Local Const $sIID_IBaseFilter = "{56a86895-0ad4-11ce-b03a-0020af0ba770}"
    Local $dtagIBaseFilter = $dtagIUnknown & _
            "GetClassID hresult(ptr*);" & _; IPersist
            "Stop hresult();" & _
            "Pause hresult();" & _
            "Run hresult(int64);" & _
            "GetState hresult(dword;dword*);" & _
            "SetSyncSource hresult(ptr);" & _
            "GetSyncSource hresult(ptr*);" & _ ; IMediaFilter
            "EnumPins hresult(ptr*);" & _
            "FindPin hresult(wstr;ptr*);" & _
            "QueryFilterInfo hresult(ptr*);" & _
            "JoinFilterGraph hresult(ptr;wstr);" & _
            "QueryVendorInfo hresult(wstr*);" ; IBaseFilter
    ; Create object
    Local $oBaseFilter = _AutoItObject_ObjCreate($sCLSID_WMAsfReader, $sIID_IBaseFilter, $dtagIBaseFilter)
    If @error Then Return SetError(1, 0, False)
    ; AddFilter is "must" to be able to use it
    $oGraphBuilder.AddFilter($oBaseFilter.__ptr__, "anything")

    ; File will be loaded using FileSourceFilter object
    ; IFileSourceFilter definition
    Local Const $sIID_IFileSourceFilter = "{56a868a6-0ad4-11ce-b03a-0020af0ba770}"
    Local $dtagIFileSourceFilter = $dtagIUnknown & _
            "Load hresult(wstr;ptr);" & _
            "GetCurFile hresult(ptr*;ptr);"

    Local $tIID_IFileSourceFilter = _AutoItObject_CLSIDFromString($sIID_IFileSourceFilter)
    ; Ask for FileSourceFilter object from BaseFilter
    Local $aCall = $oBaseFilter.QueryInterface(Number(DllStructGetPtr($tIID_IFileSourceFilter)), 0)
    If Not IsArray($aCall) Then Return SetError(2, 0, False)
    ; Wrapp it
    Local $oFileSourceFilter = _AutoItObject_WrapperCreate($aCall[2], $dtagIFileSourceFilter)

    ; Load the file now
    $oFileSourceFilter.Load($sFile, 0)

    $aCall = $oFileSourceFilter.GetCurFile(0, 0)
    Local $pFile = $aCall[1]
    Local $sLoaded = DllStructGetData(DllStructCreate("wchar[" & __Au3Obj_PtrStringLen($pFile) + 1 & "]", $pFile), 1)
    __Au3Obj_CoTaskMemFree($pFile)
    ConsoleWrite($sLoaded & @CRLF)

    ; Get pointer to EnumPins object
    $aCall = $oBaseFilter.EnumPins(0)
    If Not IsArray($aCall) Or Not $aCall[1] Then Return SetError(3, 0, False)
    Local $pEnum = $aCall[1]

    ; Define IEnumPins methods
    Local $dtagIEnumPins = $dtagIUnknown & _
            "Next hresult(dword;ptr*;dword*);" & _
            "Skip hresult(dword);" & _
            "Reset hresult();" & _
            "Clone hresult(ptr*);"
    ; Wrapp it
    Local $oEnum = _AutoItObject_WrapperCreate($pEnum, $dtagIEnumPins)

    ; Will enumerate all PINs and render them
    Local $pPin
    While 1
        $aCall = $oEnum.Next(1, 0, 0)
        If Not IsArray($aCall) Then Return SetError(4, 0, False)
        $pPin = $aCall[2]
        If $pPin Then
            $oGraphBuilder.Render($pPin)
            _AutoItObject_IUnknownRelease($pPin); releasing non-wrapped object when no longer needed
        EndIf
        If $aCall[0] Then ExitLoop
    WEnd

    ; All's ok
    Return True
EndFunc   ;==>_WMAsfReaderLoad


Func _ErrFunc()
;~  ConsoleWrite("! COM Error !  Number: 0x" & Hex($oCOMError.number, 8) & "   ScriptLine: " & $oCOMError.scriptline & " - " & $oCOMError.windescription & @CRLF)
EndFunc   ;==>_ErrFunc

KNOWN BUGS:

- Doesn't refresh when a station is added

- Forgot to remove that stupid message box I put in for testing purposes! When you add a station, the program automatically removes http:// if it is included (It is added back before the station is added), just to check for a port. It only checks for the : character, and that is why http:// was removed. Therefore, if you just type the : and then no port, it will still accept it, but you are stabbing yourself in the back.

Registry Version

#Region ;**** Directives created by AutoIt3Wrapper_GUI ****
#AutoIt3Wrapper_icon=irate_radio.ico
#AutoIt3Wrapper_outfile=LiveStreamingreg.exe
#AutoIt3Wrapper_Res_Description=Internet Radio!
#AutoIt3Wrapper_Res_Fileversion=2.1.0.0
;#AutoIt3Wrapper_Run_AU3Check=n
#EndRegion ;**** Directives created by AutoIt3Wrapper_GUI ****
;#AutoIt3Wrapper_AU3Check_Parameters=-d -w 1 -w 2 -w 3 -w 4 -w 5 -w 6

;------LIVE STREAM PLAYER-v2------------------------------------;
;.......script written by trancexx (trancexx at yahoo dot com)..;
;.......and edited by shanet....................................;
;                                                               ;
;-------New Features                                            ;
; -- Close to tray                                              ;
;       You can now minimize to the taskbar, and close to the   ;
;       system tray!                                            ;
;       To exit, right click the tray icon and select exit.     ;
;       To show the GUI, double click the icon.                 ;
;                                                               ;
; -- Select station                                             ;
;       You can now change the station and add new stations!    ;
;       To change the station, choose the one you wish to change;
;       to and click change.                                    ;
;       To add a new station, input the site into stations.ini  ;
;       as a new line.                                          ;
;---------------------------------------------------------------;


#include <objects\AutoitObject.au3>
#include <ComboConstants.au3>
#include <GUIExtender.au3>

Opt("TrayMenuMode", 1)
Opt("MustDeclareVars", 1)

Global $sMediaFile, $stations
If RegRead("HKCU\Software\LiveStreaming", "stations") = "" Then
    RegWrite("HKCU\Software\LiveStreaming", "stations", "REG_SZ", "http://173.193.14.170:8012|http://94.76.208.7:8001|http://212.45.104.50:8050|http://119.207.75.238:11250|http://norway.discovertrance.com:8000|http://u15c.di.fm:80/di_minimal|http://scfire-dtc-aa01.stream.aol.com:80/stream/1003|http://ns24907.ovh.net:8000|http://63.247.82.38:8000|http://89.238.146.240:9050|http://87.230.84.182:6666")
    $stations = RegRead("HKCU\Software\LiveStreaming", "stations")
Else
    $stations = RegRead("HKCU\Software\LiveStreaming", "stations")
EndIf

; Error monitoring
Global $oCOMError = ObjEvent("AutoIt.Error", "_ErrFunc")

; Let the magic begin...
_AutoItObject_StartUp()

; DLLs to use
Global $oUSER32DLL = _AutoItObject_DllOpen("user32.dll")

; GUI
Global $hGUI = GUICreate("Live Streaming", 258, 107)

_GUIExtender_Init($hGUI)                                                                ;Used for the extendable stations controls

Global $hVolSlider = GUICtrlCreateSlider(10, 14, 28, 64, 10 + 16)
GUICtrlSetTip(-1, "100 %VOL")
GUICtrlCreateLabel("VOL", 40, 21, 68, 20)
GUICtrlSetFont(-1, 9, -1, 2, "Curier New")

Global $hButtonPlay = GUICtrlCreateButton("&Pause", 80, 20, 115, 25)
Global $hLabelInfo = GUICtrlCreateLabel("Choose a station", 90, 60, 130, 25)
GUICtrlSetFont(-1, 9, -1, 2, "Arial")
Global $hLevMet
Global $hButtonExtend = GUICtrlCreateButton(" â–¼ ", 5, 77)
Global $hCheckboxTray = GUICtrlCreateCheckbox("Close to Tray", 173, 82)
GUICtrlSetState($hCheckboxTray, 1)

;Retractable controls
Global $stationsExtender = _GUIExtender_Section_Start(107, 60)                          ;Starts the extendable controls
Global $hStatSel = GUICtrlCreateCombo($sMediaFile, 20, 110, 222, 15, $CBS_DROPDOWNLIST)
GUICtrlSetData($hStatSel, $stations)
Global $hButtonAddStation = GUICtrlCreateButton("Add Station", 5, 135, 65)
Global $hInputAddStation = GUICtrlCreateInput("New Station", 75, 135, 175)


_GUIExtender_Section_End()
; Tray
Global $trayinfo = 0
TraySetClick(16)

Global $traypaus = TrayCreateItem("Pause")
TrayItemSetState($traypaus, 4)
Global $trayexit = TrayCreateItem("Exit")
TrayItemSetState($trayexit, 4)


; Objects
Global $oGraphBuilder, $oMediaControl, $oBasicAudio, $oAudioMeterInformation

; Level-meter
_AudioVolObject($oAudioMeterInformation)
If Not @error Then ; if this objects are available on the system then add control for it
    $hLevMet = GUICtrlCreateProgress(220, 15, 20, 60, 4)
    AdlibRegister("_LevelMeter", 45)
EndIf

; Misc variables
Global $iPlaying = 1, $iVol

; Show GUI
GUISetState()


; Main loop
While 1

    Switch GUIGetMsg()
        Case $hStatSel
            GUICtrlSetFont($hLabelInfo, 9, -1, 2, "Arial")
            GUICtrlSetData($hLabelInfo, "...Connecting...")
            GUICtrlSetColor($hLabelInfo, 0x000000)
            $sMediaFile = GUICtrlRead($hStatSel)
        Case $hButtonExtend
;           MsgBox(0, "Coming Soon...", "This option is not yet implemented. It is coming soon." & @CRLF & "Besides, there is nothing there anyway... yet...")
            if _GUIExtender_Section_State($stationsExtender) = 1 Then
                _GUIExtender_Section_Extend($stationsExtender, False)
                GUICtrlSetData($hButtonExtend, " â–¼ ")
            Else
                _GUIExtender_Section_Extend($stationsExtender, True)
                GUICtrlSetData($hButtonExtend, " â–² ")
            EndIf
        Case -3
            Global $mintray
            $mintray = GUICtrlRead($hCheckboxTray)
            if $mintray = 1 Then
                if $trayinfo = 0 Then
                    $trayinfo = 1
                    MsgBox(0, "Close to Tray", "You have closed to the system tray." & @LF & "To show the GUI again, double click the tray icon." & @LF & "To exit, right click the tray icon and choose exit.")
                EndIf

                if _GUIExtender_Section_State($stationsExtender) = 1 Then
                    _GUIExtender_Section_Extend($stationsExtender, False)
                    GUICtrlSetData($hButtonExtend, " â–¼ ")
                EndIf
                GUISetState(@SW_HIDE, $hGUI)
            Else
                ExitLoop
            EndIf
        Case $hButtonAddStation
            Global $newStation = GUICtrlRead($hInputAddStation)
            If StringInStr($newStation, "http://") Then
                $newStation = StringReplace($newStation, "http://", "")
                MsgBox(0, "", "Removed http")
            EndIf
            If StringInStr($newStation, ":") = 0 Then
                MsgBox(0, "ERROR", "Please include a port!")
            Else
                RegWrite("HKCU\Software\LiveStreaming", "stations", "REG_SZ", RegRead("HKCU\Software\LiveStreaming", "stations") & "|http://" & $newStation)
            EndIf
            $stations = RegRead("HKCU\Software\LiveStreaming", "stations")
            GUICtrlSetData($hStatSel, $stations)
        Case $hButtonPlay
            If $iPlaying Then
                $oMediaControl.Pause()
                GUICtrlSetData($hButtonPlay, "&Play")
                TrayItemSetText($traypaus, "Play")
                TrayItemSetState($traypaus, 4)
                $iPlaying = 0
            Else
                $oMediaControl.Run()
                GUICtrlSetData($hButtonPlay, "&Pause")
                TrayItemSetText($traypaus, "Pause")
                TrayItemSetState($traypaus, 4)
                $iPlaying = 1
            EndIf
        EndSwitch

    Switch TrayGetMsg()
        Case $trayexit
            ExitLoop
        Case $traypaus
            If $iPlaying Then
                $oMediaControl.Pause()
                GUICtrlSetData($hButtonPlay, "&Play")
                $iPlaying = 0
            Else
                $oMediaControl.Run()
                GUICtrlSetData($hButtonPlay, "&Pause")
                $iPlaying = 1
            EndIf
        Case -13
            GUISetState(@SW_SHOW, $hGUI)
    EndSwitch
    If $iVol <> GUICtrlRead($hVolSlider) Then
        $iVol = GUICtrlRead($hVolSlider)
        If IsObj($oBasicAudio) Then $oBasicAudio.put_Volume(-Exp(0.65 * ($iVol * 1.4) / 10))    ; Only works between 0 and 65%. Default line:       If IsObj($oBasicAudio) Then $oBasicAudio.put_Volume(-Exp(0.65 * ($iVol) / 10.84))
        GUICtrlSetTip($hVolSlider, 100 - $iVol & " %VOL")
    EndIf
    If $sMediaFile Then _RenderFile($sMediaFile)
WEnd

; Free before the end
_Quit()

;THE END

Func _Quit()
    AdlibUnRegister()
    ; Release objests
    _ReleaseBuilder($oGraphBuilder, $oMediaControl, $oBasicAudio)
    $oAudioMeterInformation = 0
    ; Bye bye
    Exit
EndFunc   ;==>_Quit

Func _LevelMeter()
    Local $aCall = $oAudioMeterInformation.GetPeakValue(0)
    If IsArray($aCall) Then
        Local $iCurrentRead = 100 * $aCall[1]
        GUICtrlSetData($hLevMet, $iCurrentRead + 1)
        GUICtrlSetData($hLevMet, $iCurrentRead)
    EndIf
EndFunc   ;==>_LevelMeter


Func _AudioVolObject(ByRef $oAudioMeterInformation)
    Local Const $sCLSID_MMDeviceEnumerator = "{BCDE0395-E52F-467C-8E3D-C4579291692E}"
    Local Const $sIID_IMMDeviceEnumerator = "{A95664D2-9614-4F35-A746-DE8DB63617E6}"
    Global $dtagIMMDeviceEnumerator = $dtagIUnknown & _
            "EnumAudioEndpoints hresult(dword;dword;ptr*);" & _
            "GetDefaultAudioEndpoint hresult(dword;dword;ptr*);" & _
            "GetDevice hresult(wstr;ptr*);" & _
            "RegisterEndpointNotificationCallback hresult(ptr);" & _
            "UnregisterEndpointNotificationCallback hresult(ptr);"

    Local $dtagIMMDevice = $dtagIUnknown & _
            "Activate hresult(ptr;dword;variant*;ptr*);" & _
            "OpenPropertyStore hresult(dword;ptr*);" & _
            "GetId hresult(wstr*);" & _
            "GetState hresult(dword*);"

    Local Const $sIID_IAudioMeterInformation = "{C02216F6-8C67-4B5B-9D00-D008E73E0064}"
    Local $dtagIAudioMeterInformation = $dtagIUnknown & _
            "GetPeakValue hresult(float*);" & _
            "GetMeteringChannelCount hresult(dword*);" & _
            "GetChannelsPeakValues hresult(dword;float*);" & _
            "QueryHardwareSupport hresult(dword*);"

    ; MMDeviceEnumerator
    Local $oMMDeviceEnumerator = _AutoItObject_ObjCreate($sCLSID_MMDeviceEnumerator, $sIID_IMMDeviceEnumerator, $dtagIMMDeviceEnumerator)
    If @error Then Return SetError(1, 0, 0)

    ; DefaultAudioEndpoint
    Local $aCall = $oMMDeviceEnumerator.GetDefaultAudioEndpoint(0, 0, 0) ; eRender, eConsole
    If Not IsArray($aCall) Then Return SetError(2, 0, 0)
    Local $oDefaultDevice = _AutoItObject_WrapperCreate($aCall[3], $dtagIMMDevice)

    ; AudioMeterInformation
    Local $pIID_IAudioMeterInformation = _AutoItObject_CLSIDFromString($sIID_IAudioMeterInformation)
    $aCall = $oDefaultDevice.Activate(Number(DllStructGetPtr($pIID_IAudioMeterInformation)), 1, 0, 0)
    If Not IsArray($aCall) Then Return SetError(3, 0, 0)
    $oAudioMeterInformation = _AutoItObject_WrapperCreate($aCall[4], $dtagIAudioMeterInformation)

    ; That's it
    Return True
EndFunc   ;==>_AudioVolObject

Func _InitBuilder(ByRef $oGraphBuilder, ByRef $oMediaControl, ByRef $oBasicAudio)
    ; Needed identifiera
    Local $sCLSID_FilterGraph = "{E436EBB3-524F-11CE-9F53-0020AF0BA770}"
    Local $sIID_IGraphBuilder = "{56A868A9-0AD4-11CE-B03A-0020AF0BA770}"
    ; More...
    Local $tIID_IMediaControl = _AutoItObject_CLSIDFromString("{56A868B1-0AD4-11CE-B03A-0020AF0BA770}")
    Local $tIID_IBasicAudio = _AutoItObject_CLSIDFromString("{56A868B3-0AD4-11CE-B03A-0020AF0BA770}")

    ; Define IGraphBuilder methods
    Local $dtagIGraphBuilder = $dtagIUnknown & _
            "AddFilter hresult(ptr;wstr);" & _
            "RemoveFilter hresult(ptr);" & _
            "EnumFilters hresult(ptr*);" & _
            "FindFilterByName hresult(wstr;ptr*);" & _
            "ConnectDirect hresult(ptr;ptr;ptr);" & _
            "Reconnect hresult(ptr);" & _
            "Disconnect hresult(ptr);" & _
            "SetDefaultSyncSource hresult();" & _ ; IFilterGraph
            "Connect hresult(ptr;ptr);" & _
            "Render hresult(ptr);" & _
            "RenderFile hresult(wstr;ptr);" & _
            "AddSourceFilter hresult(wstr;wstr;ptr*);" & _
            "SetLogFile hresult(dword_ptr);" & _
            "Abort hresult();" & _
            "ShouldOperationContinue hresult();" ; IGraphBuilder

    ; Wrapp IGraphBuilder interface
    $oGraphBuilder = _AutoItObject_ObjCreate($sCLSID_FilterGraph, $sIID_IGraphBuilder, $dtagIGraphBuilder)
    If @error Then Return SetError(1, 0, False)

    ; IMediaControl IDispatch
    Local $aCall = $oGraphBuilder.QueryInterface(Number(DllStructGetPtr($tIID_IMediaControl)), 0)
    If IsArray($aCall) And $aCall[2] Then
        $oMediaControl = _AutoItObject_PtrToIDispatch($aCall[2])
    Else
        Return SetError(2, 0, False)
    EndIf

    Local $pBasicAudio
    ; Get pointer to IBasicAudio interface
    $aCall = $oGraphBuilder.QueryInterface(Number(DllStructGetPtr($tIID_IBasicAudio)), 0)
    If IsArray($aCall) And $aCall[2] Then
        $pBasicAudio = $aCall[2]
    Else
        Return SetError(3, 0, False)
    EndIf

    ; IBasicAudio is dual interface. Defining vTable methods:
    Local $dtagIBasicAudio = $dtagIDispatch & _
            "put_Volume hresult(long);" & _
            "get_Volume hresult(long*);" & _
            "put_Balance hresult(long);" & _
            "get_Balance hresult(long*);" ; IBasicAudio

    ; Wrapp it:
    $oBasicAudio = _AutoItObject_WrapperCreate($pBasicAudio, $dtagIBasicAudio)
    If @error Then Return SetError(4, 0, False)

    Return True ; There
EndFunc   ;==>_InitBuilder

Func _ReleaseBuilder(ByRef $oGraphBuilder, ByRef $oMediaControl, ByRef $oBasicAudio)
    $oMediaControl.Stop()
    $oBasicAudio = 0
    $oMediaControl = 0
    $oGraphBuilder.Release() ;<-!
    $oGraphBuilder = 0
EndFunc   ;==>_ReleaseBuilder

Func _RenderFile(ByRef $sMediaFile)
    _ReleaseBuilder($oGraphBuilder, $oMediaControl, $oBasicAudio)
    _InitBuilder($oGraphBuilder, $oMediaControl, $oBasicAudio)
    If Not _WMAsfReaderLoad($sMediaFile) Then
        $oUSER32DLL.MessageBeep("int", "dword", 48)
        $sMediaFile = ""
        Return SetError(1, 0, False)
    EndIf
    $oCOMError.number = 0 ; set no-error condition
    $oMediaControl.Run()
    ; Check for error
    If $oCOMError.number Then
;       GUISetState(@SW_SHOW, $hGUI)
        GUICtrlSetFont($hLabelInfo, 9, -1, 1, "Arial")
        GUICtrlSetData($hLabelInfo, "Streaming failed")
        GUICtrlSetColor($hLabelInfo, 0xFF0000)
        MsgBox(48, "Error", "Failed to stream", 0, $hGUI)
    Else
        GUICtrlSetFont($hLabelInfo, 9, -1, 1, "Arial")
        GUICtrlSetData($hLabelInfo, "    Connected!")
    EndIf
    $sMediaFile = ""
    Return True
EndFunc   ;==>_RenderFile

Func _WMAsfReaderLoad($sFile)
    Local Const $sCLSID_WMAsfReader = "{187463A0-5BB7-11d3-ACBE-0080C75E246E}"
    ; IBaseFilter definition
    Local Const $sIID_IBaseFilter = "{56a86895-0ad4-11ce-b03a-0020af0ba770}"
    Local $dtagIBaseFilter = $dtagIUnknown & _
            "GetClassID hresult(ptr*);" & _; IPersist
            "Stop hresult();" & _
            "Pause hresult();" & _
            "Run hresult(int64);" & _
            "GetState hresult(dword;dword*);" & _
            "SetSyncSource hresult(ptr);" & _
            "GetSyncSource hresult(ptr*);" & _ ; IMediaFilter
            "EnumPins hresult(ptr*);" & _
            "FindPin hresult(wstr;ptr*);" & _
            "QueryFilterInfo hresult(ptr*);" & _
            "JoinFilterGraph hresult(ptr;wstr);" & _
            "QueryVendorInfo hresult(wstr*);" ; IBaseFilter
    ; Create object
    Local $oBaseFilter = _AutoItObject_ObjCreate($sCLSID_WMAsfReader, $sIID_IBaseFilter, $dtagIBaseFilter)
    If @error Then Return SetError(1, 0, False)
    ; AddFilter is "must" to be able to use it
    $oGraphBuilder.AddFilter($oBaseFilter.__ptr__, "anything")

    ; File will be loaded using FileSourceFilter object
    ; IFileSourceFilter definition
    Local Const $sIID_IFileSourceFilter = "{56a868a6-0ad4-11ce-b03a-0020af0ba770}"
    Local $dtagIFileSourceFilter = $dtagIUnknown & _
            "Load hresult(wstr;ptr);" & _
            "GetCurFile hresult(ptr*;ptr);"

    Local $tIID_IFileSourceFilter = _AutoItObject_CLSIDFromString($sIID_IFileSourceFilter)
    ; Ask for FileSourceFilter object from BaseFilter
    Local $aCall = $oBaseFilter.QueryInterface(Number(DllStructGetPtr($tIID_IFileSourceFilter)), 0)
    If Not IsArray($aCall) Then Return SetError(2, 0, False)
    ; Wrapp it
    Local $oFileSourceFilter = _AutoItObject_WrapperCreate($aCall[2], $dtagIFileSourceFilter)

    ; Load the file now
    $oFileSourceFilter.Load($sFile, 0)

    $aCall = $oFileSourceFilter.GetCurFile(0, 0)
    Local $pFile = $aCall[1]
    Local $sLoaded = DllStructGetData(DllStructCreate("wchar[" & __Au3Obj_PtrStringLen($pFile) + 1 & "]", $pFile), 1)
    __Au3Obj_CoTaskMemFree($pFile)
    ConsoleWrite($sLoaded & @CRLF)

    ; Get pointer to EnumPins object
    $aCall = $oBaseFilter.EnumPins(0)
    If Not IsArray($aCall) Or Not $aCall[1] Then Return SetError(3, 0, False)
    Local $pEnum = $aCall[1]

    ; Define IEnumPins methods
    Local $dtagIEnumPins = $dtagIUnknown & _
            "Next hresult(dword;ptr*;dword*);" & _
            "Skip hresult(dword);" & _
            "Reset hresult();" & _
            "Clone hresult(ptr*);"
    ; Wrapp it
    Local $oEnum = _AutoItObject_WrapperCreate($pEnum, $dtagIEnumPins)

    ; Will enumerate all PINs and render them
    Local $pPin
    While 1
        $aCall = $oEnum.Next(1, 0, 0)
        If Not IsArray($aCall) Then Return SetError(4, 0, False)
        $pPin = $aCall[2]
        If $pPin Then
            $oGraphBuilder.Render($pPin)
            _AutoItObject_IUnknownRelease($pPin); releasing non-wrapped object when no longer needed
        EndIf
        If $aCall[0] Then ExitLoop
    WEnd

    ; All's ok
    Return True
EndFunc   ;==>_WMAsfReaderLoad


Func _ErrFunc()
;~  ConsoleWrite("! COM Error !  Number: 0x" & Hex($oCOMError.number, 8) & "   ScriptLine: " & $oCOMError.scriptline & " - " & $oCOMError.windescription & @CRLF)
EndFunc   ;==>_ErrFunc

KNOWN BUGS:

- When you add a new station, it adds all the current ones to the list, however this can be fixed by restarting the application.

Stations!

http://173.193.14.170:8012

http://94.76.208.7:8001

http://212.45.104.50:8050

http://119.207.75.238:11250

http://norway.discovertrance.com:8000

http://u15c.di.fm:80/di_minimal

http://scfire-dtc-aa01.stream.aol.com:80/stream/1003

http://ns24907.ovh.net:8000

http://63.247.82.38:8000

http://89.238.146.240:9050

http://87.230.84.182:6666

http://178.238.130.146:8006/

Download the file containing the compiled file, icon and stations.ini (if not the registry version(attached)

Attached files do NOT contain source code because im a stingy bastard and I had to delete the last files that had the code in them to upload the updated version because I have very little space left.

shanet

UDFs used in this version:

Melba 23's

Make sure you look at and fix the UDF accordingly.

LiveStreaming.zip

LiveStreamingReg.zip

Edited by shanet

[font="Comic Sans MS"]My code does not have bugs! It just develops random features.[/font]My Projects[list][*]Live Streaming (Not my project, but my edited version)[right]AutoIt Wrappers![/right][/list]Pure randomness[list][*]Small Minds.......................................................................................................[size="1"]Simple progress bar that changes direction at either sides.[/size][*]ChristmasIt AutoIt Christmas Theme..........................................................[size="1"]I WAS BOOOORED![/size][*]DriveToy..............................................................................................................[size="1"]Simple joke script. Trick your friends into thinking their computer drive is haywire![/size][/list]In Development[list][*]Your Background Task Organiser[*]AInstall Second Generation[/list]BEFORE POSTING ON THE FORUMS, TRY THIS:

%programfiles%/AutoIt3/autoit3.chm
Link to comment
Share on other sites

@trancexx

Thanks ! This work perfectly, and push me to walk toward the path of AutoitObject !!

@shanet: like your version as well, and it is a nice way to use melba23's gui extender !!

hmm, fun to see people still getting pissed off over trancexx's communicating way !! which makes me think of character House on TeeVee hehe,... that would be a compliment, guy's such a brilliant one!!

bye

Edited by hench
Link to comment
Share on other sites

@trancexx

Thanks ! This work perfectly, and push me to walk toward the path of AutoitObject !!

It is her script that made it all happen.

@shanet: like your version as well, and it is a nice way to use melba23's gui extender !!

Thanks, Trancexx and Melba23 have been massive helps here. Couldn't get this far without them.

Any ideas for the project?

shanet

[font="Comic Sans MS"]My code does not have bugs! It just develops random features.[/font]My Projects[list][*]Live Streaming (Not my project, but my edited version)[right]AutoIt Wrappers![/right][/list]Pure randomness[list][*]Small Minds.......................................................................................................[size="1"]Simple progress bar that changes direction at either sides.[/size][*]ChristmasIt AutoIt Christmas Theme..........................................................[size="1"]I WAS BOOOORED![/size][*]DriveToy..............................................................................................................[size="1"]Simple joke script. Trick your friends into thinking their computer drive is haywire![/size][/list]In Development[list][*]Your Background Task Organiser[*]AInstall Second Generation[/list]BEFORE POSTING ON THE FORUMS, TRY THIS:

%programfiles%/AutoIt3/autoit3.chm
Link to comment
Share on other sites

shanet,

about the reg/ini debate, I'd vote for the portability: ini version for sure. !

Ideas on the way :

- Don't know the feasibility : show basic informations about the song being played, does stations broadcast this info ?

- HotKey to restore/activate from Tray

- skinable gui, which may interfere with portability :x

hench

Link to comment
Share on other sites

about the reg/ini debate, I'd vote for the portability: ini version for sure. !

I thought it would be better to do both ;D

That way we get the best of both worlds.

I prefer portability two.

Ideas on the way :

- Don't know the feasibility : show basic informations about the song being played, does stations broadcast this info ?

This has crossed my mind, I just need to find out how to do it :P

- HotKey to restore/activate from Tray

I can do that :shifty:

Any specific keys?

- skinable gui, which may interfere with portability :x

Didn't even cross my mind. I guess it could be done for those who want it done.

Do you just mean a background image or the full deal?

Thanks for the ideas!

shanet

[font="Comic Sans MS"]My code does not have bugs! It just develops random features.[/font]My Projects[list][*]Live Streaming (Not my project, but my edited version)[right]AutoIt Wrappers![/right][/list]Pure randomness[list][*]Small Minds.......................................................................................................[size="1"]Simple progress bar that changes direction at either sides.[/size][*]ChristmasIt AutoIt Christmas Theme..........................................................[size="1"]I WAS BOOOORED![/size][*]DriveToy..............................................................................................................[size="1"]Simple joke script. Trick your friends into thinking their computer drive is haywire![/size][/list]In Development[list][*]Your Background Task Organiser[*]AInstall Second Generation[/list]BEFORE POSTING ON THE FORUMS, TRY THIS:

%programfiles%/AutoIt3/autoit3.chm
Link to comment
Share on other sites

I saw that :x

I intend to look at it over the next few days.

[font="Comic Sans MS"]My code does not have bugs! It just develops random features.[/font]My Projects[list][*]Live Streaming (Not my project, but my edited version)[right]AutoIt Wrappers![/right][/list]Pure randomness[list][*]Small Minds.......................................................................................................[size="1"]Simple progress bar that changes direction at either sides.[/size][*]ChristmasIt AutoIt Christmas Theme..........................................................[size="1"]I WAS BOOOORED![/size][*]DriveToy..............................................................................................................[size="1"]Simple joke script. Trick your friends into thinking their computer drive is haywire![/size][/list]In Development[list][*]Your Background Task Organiser[*]AInstall Second Generation[/list]BEFORE POSTING ON THE FORUMS, TRY THIS:

%programfiles%/AutoIt3/autoit3.chm
Link to comment
Share on other sites

  • 2 weeks later...

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
 Share

  • Recently Browsing   0 members

    • No registered users viewing this page.
×
×
  • Create New...