AutoHotkey Community

It is currently May 27th, 2012, 4:09 am

All times are UTC [ DST ]




Post new topic Reply to topic  [ 10 posts ] 
Author Message
PostPosted: March 8th, 2010, 6:24 pm 
Offline

Joined: January 31st, 2005, 9:50 am
Posts: 3910
Location: Bremen, Germany
This is a mod of the BASS wrapper done by k3ph. This wrapper only uses global variables when needed. And it simplifies some actions (I hope).

You'll need the bass.dll => www.un4seen.com

The wrapper for bass.dll => www.autohotkey.net/~toralf/BASS/bass.ahk

And the bass_acc.dll and wrapper for AAC files: www.un4seen.com &
www.autohotkey.net/~toralf/BASS/bassaac.ahk

With time I might add more wrappers for add-ons. Currently AAC is all I needed.

A Demo script will be posted soon.

_________________
Ciao
toralf
Image


Report this post
Top
 Profile  
Reply with quote  
 Post subject:
PostPosted: February 6th, 2011, 2:05 pm 
toralf, a little help please. I have put the two ahk files and both bass.dll and bass_aac.dll into a common directory. I have futher attemped to fill in the dll path and dll name into bassaac.ahk, but obviously not correctly. A simple demo script (as promised :wink: ) to load and play an acc file would be greatly appreciated.


Report this post
Top
  
Reply with quote  
 Post subject: Failure here too
PostPosted: June 28th, 2011, 11:24 am 
Offline

Joined: January 20th, 2007, 1:29 pm
Posts: 96
Location: Melbourne
Any chance of that example code to set us on the right path?
By any chance have you dabbled in the Bass_fx.dll and figured out tempo and keychange? i have been poking around in karaoke for a few years and this bass wrapping might be the answer im looking for.

Thanks in advance, I can happily say that Toralfcode has wormed its way permanently into at least half of my own projects, :lol:

_________________
Image


Report this post
Top
 Profile  
Reply with quote  
 Post subject:
PostPosted: September 3rd, 2011, 6:10 am 
Offline

Joined: October 1st, 2005, 9:55 pm
Posts: 775
Location: Texas, USA
skwire was kind enough to point me to this thread. I completely missed it when it was first published (March 2010).

The BASS library published by k3ph (link: here) is significantly more robust that this library but it is very complex and I imagine that a lot people never bothered to play with it because it is overwhelming. The library also uses a very large number of global variables.

The toralf version of the BASS library (this thread) is a significantly scaled down version of k3ph's BASS library but it appears to do most of the stuff that a developer needs to create a basic media player.

There are no examples for this library so I created a couple while learning how to use this library. I'm sharing just in case anyone else can benefit from them.

Requirements: These examples need the bass.ahk and the bass.dll files. See the first post in this thread for links to these files.

Standard Example:
Code:
#NoEnv
#SingleInstance Force

OnExit Exit

;-- Initialize
BASS_ACTIVE_STOPPED :=0
BASS_ACTIVE_PLAYING :=1
BASS_ACTIVE_STALLED :=2  ;-- Playback of the stream has been stalled due to a lack of sample data. The playback will automatically resume once there is sufficient data to do so.
BASS_ACTIVE_PAUSED  :=3
BASS_Load()
hStream:=""


;-- Build GUI
gui Margin,0,0
gui Add,Button,w70 h40,Open
gui Add,Button,x+0 wp hp,Play
gui Add,Button,x+0 wp hp,Pause
gui Add,Button,x+0 wp hp,Stop
gui,Add,Button,x+0 wp hp,Rev10
gui,Add,Button,x+0 wp hp,Middle
gui,Add,Button,x+0 wp hp,Fwd10
gui Show

gosub ButtonOpen
return


GUIEscape:
GUIClose:
if hStream
    hStream:=BASS_Stop()

ExitApp


ButtonOpen:
if hStream
    hStream:=BASS_Stop()

if not DefaultFolder
    DefaultFolder:=A_MyDocuments

gui +OwnDialogs
FileSelectFile MediaFile,1,%DefaultFolder%,Choose a media file
if (MediaFile="")
   return

SplitPath MediaFile,,DefaultFolder

gosub ButtonPlay
return


ButtonPlay:
if not hStream
    hStream:=BASS_Play(MediaFile)
 else
    {
    Status:=BASS_IsPlaying(hStream)
    if (Status=BASS_ACTIVE_PLAYING)
        BASS_SetPos(hStream,0)
     else
        if (Status=BASS_ACTIVE_PAUSED)
            BASS_Pause()
         else  ;-- Everything else
            {
            hStream:=BASS_Stop()  ;-- Necessary if stalled
            hStream:=BASS_Play(MediaFile)
            }
    }

return


ButtonPause:
if hStream
    {
    Status:=BASS_IsPlaying(hStream)
    if Status in %BASS_ACTIVE_PLAYING%,%BASS_ACTIVE_STALLED%,%BASS_ACTIVE_PAUSED%
        BASS_Pause()
    }


return


ButtonStop:
if hStream
    hStream:=BASS_Stop()

return


ButtonFwd10:
if hStream
    {
    Status:=BASS_IsPlaying(hStream)
    if Status in %BASS_ACTIVE_PLAYING%,%BASS_ACTIVE_PAUSED%
        {
        NewPos:=BASS_Bytes2Seconds(hStream,BASS_GetPos(hStream))+10
        MaxPos:=BASS_Bytes2Seconds(hStream,BASS_GetLen(hStream))
        if (NewPos>=MaxPos)
            NewPos:=MaxPos-0.05

        BASS_SetPos(hStream,BASS_Seconds2Bytes(hStream,NewPos))
        }
    }

return


ButtonMiddle:
if hStream
    {
    Status:=BASS_IsPlaying(hStream)
    if Status in %BASS_ACTIVE_PLAYING%,%BASS_ACTIVE_PAUSED%
        {
        NewPos:=BASS_Bytes2Seconds(hStream,BASS_GetLen(hStream))/2
        BASS_SetPos(hStream,BASS_Seconds2Bytes(hStream,NewPos))
        }
    }

return


ButtonRev10:
if hStream
    {
    Status:=BASS_IsPlaying(hStream)
    if Status in %BASS_ACTIVE_PLAYING%,%BASS_ACTIVE_PAUSED%
        {
        NewPos:=BASS_Bytes2Seconds(hStream,BASS_GetPos(hStream))-10
        if (NewPos<0)
            NewPos:=0

        BASS_SetPos(hStream,BASS_Seconds2Bytes(hStream,NewPos))
        }
    }

return


Exit:
BASS_Free()
ExitApp


#include bass.ahk


Playlist Example:
Code:
#NoEnv
#SingleInstance Force

OnExit Exit

;-- Initialize
BASS_ACTIVE_STOPPED :=0
BASS_ACTIVE_PLAYING :=1
BASS_ACTIVE_STALLED :=2
    ;-- Playback of the stream has been stalled due to a lack of sample data.
    ;   The playback will automatically resume once there is sufficient data to
    ;   do so.

BASS_ACTIVE_PAUSED  :=3
BASS_Load()
hStream:=""

;-- Build GUI
gui Margin,0,0
gui Add,Button,w100 h50        gOpen ,Open
gui Add,Button,x+0 wp hp       gPlay ,Play
gui Add,Button,x+0 wp hp       gPause,Pause
gui Add,Button,x+0 wp hp vStop gStop ,Stop
gui Add,Button,x+0 wp hp       gPrev ,Prev
gui Add,Button,x+0 wp hp       gNext ,Next

gui Add
   ,Progress
   ,x+0 w10 hp
        || cNavy
        || Range0-32768
        || Vertical
        || vLevelLeft
       
gui Add
   ,Progress
   ,x+0 w10 hp
        || cNavy
        || Range0-32768
        || Vertical
        || vLevelRight


gui Add,Text,xm w40,%A_Space%Pos:
gui Add
   ,Slider
   ,x+0 w270
        || +Disabled  ;-- Start off disabled
        || ToolTip
        || vPosSlider
        || gPosSlider

gui Add,Text,x+0 w40 hp,%A_Space%Vol:
gui Add
   ,Slider
   ,x+0 w270 hp
        || ToolTip
        || vVolSlider
        || gVolSlider
   ,% BASS_Volume()*100


gui Add
   ,ListView
   ,xm w620 r20
        || Count1000
        || -Hdr
        || vPlaylist
        || gPlaylistAction
   ,Media File Name

gui Show

;-- Start 'R Up
gosub Open
return


GUIEscape:
GUIClose:
gosub Stop
ExitApp


PlaylistAction:
if (A_GuiEvent="DoubleClick")
    {
    ;-- Anything selected? (Seems redundant for a double-click, but it's not)
    if LV_GetCount("Selected")
        {
        PlaylistIndex:=A_EventInfo-1
        gosub Next
        }
    }

return


Open:

;-- Attach messages/dialogs to current GUI
gui +OwnDialogs

;-- Close if anything is open
if hStream
    gosub Stop

;-- Initialize
LV_Delete()
if MediaPath is Space
    MediaPath:=A_MyDocuments

;-- Browse for it
gui +OwnDialogs
FileSelectFolder
    ,MediaFolder
    ,*%MediaPath%
    ,0
    ,Add media folder...

;-- Nothing selected?
If ErrorLevel
    {
    MsgBox 48,Open Failure,No media folder selected.
    return
    }

MediaPath:=MediaFolder

;[=====================]
;[  Populate playlist  ]
;[=====================]
;-- Redraw off
GUIControl -Redraw,Playlist

;-- Find media files
$BatchLines:=A_BatchLines
SetBatchLines 50ms
Loop %MediaFolder%\*.*,,1
    if A_LoopFileExt in mp3,wav  ;-- Add more extensions if desired
        LV_Add("",A_LoopFileLongPath)

SetBatchLines %$BatchLines%

;-- Redraw on
GUIControl +Redraw,Playlist

;-- Anything loaded
if LV_GetCount()=0
    {
    MsgBox 48,Open Failure,No media files found.
    return
    }

;-- Get it started
PlaylistIndex:=0
gosub Next
return


Play:
if not hStream
    hStream:=BASS_Play(MediaFile)
 else
    {
    Status:=BASS_IsPlaying(hStream)
    if (Status=BASS_ACTIVE_PLAYING)
        BASS_SetPos(hStream,0)
     else
        if (Status=BASS_ACTIVE_PAUSED)
            BASS_Pause()
         else  ;-- Everything else
            {
            hStream:=BASS_Stop()  ;-- Necessary if stalled
            hStream:=BASS_Play(MediaFile)
            }
    }

;-- Start/Restart timers
SetTimer NotifyEOP,250
GUIControl Enable,PosSlider
SetTimer UpdatePosSlider,250
SetTimer UpdateLevel,50
return


Pause:
if hStream
    {
    Status:=BASS_IsPlaying(hStream)
    if Status in %BASS_ACTIVE_PLAYING%,%BASS_ACTIVE_STALLED%,%BASS_ACTIVE_PAUSED%
        BASS_Pause()
    }

return


Stop:
if hStream
    hStream:=BASS_Stop()

;-- NotifyEOF
SetTimer NotifyEOP,Off

;-- Position
SetTimer UpdatePosSlider,Off
GUIControl,,PosSlider,0
GUIControl Disable,PosSlider

;-- Level
SetTimer UpdateLevel,Off
GUIControl,,LevelLeft,0
GUIControl,,LevelRight,0
return


Prev:
if (PlaylistIndex>1)
    {
    PlaylistIndex-=2
    gosub Next
    }

return


Next:
Sleep 0  ;-- (Helps to) keep this thread from stepping on itself
if hStream
    gosub Stop

;-- At the end?
if (PlaylistIndex>=LV_GetCount())
    return

;-- Increment index
PlayListIndex++

;-- UnSelect all, select new item
LV_Modify(0,"-Select")
LV_Modify(PlaylistIndex,"+Select +Focus +Vis")

;-- Collect media file name
LV_GetText(MediaFile,PlaylistIndex,1)

;-- Play it
gosub Play
    ;-- This command will open the file and establish a stream

;-- Collect length (in seconds)
MediaLength:=BASS_Bytes2Seconds(hStream,BASS_GetLen(hStream))
    ;-- The length of the media file is collected once on open/play.  The value
    ;   is used by the PosSlider routine.

return


PosSlider:
if hStream
    {
    Status:=BASS_IsPlaying(hStream)
    if Status in %BASS_ACTIVE_PLAYING%,%BASS_ACTIVE_PAUSED%
        {
        if (PosSlider=100)  ;-- Moved to the very end (BASS doesn't respond to this)
            Pos:=BASS_GetLen(hStream)-1024  ;-- This usually works.  Need to determine if it the best solution.
         else
            Pos:=BASS_Seconds2Bytes(hStream,MediaLength*(PosSlider/100))

        BASS_SetPos(hStream,Pos)
        }

    ;-- Reset focus (anything but the PosSlider)
    GUIControl Focus,Stop
    }

return


UpdatePosSlider:
if hStream
    {
    Status:=BASS_IsPlaying(hStream)
    if Status in %BASS_ACTIVE_PLAYING%,%BASS_ACTIVE_PAUSED%
        {
        ;-- Only update PosSlider if object is NOT in focus
        GUIControlGet Control,FocusV
        if (Control<>"PosSlider")
            GUIControl,,PosSlider,% (BASS_Bytes2Seconds(hStream,BASS_GetPos(hStream))/MediaLength)*100
        }
    }

return


UpdateLevel:
if hStream
    {
    if (BASS_IsPlaying(hStream)=BASS_ACTIVE_PLAYING)
        {
        BASS_GetLevel(hStream,LevelLeft,LevelRight)
        GUIControl,,LevelLeft,%LevelLeft%
        GUIControl,,LevelRight,%LevelRight%
        }
     else
        {
        GUIControl,,LevelLeft,0
        GUIControl,,LevelRight,0
        }
    }

return


VolSlider:
Bass_Volume(VolSlider/100)

;-- Reset focus (anything but the VolSlider)
GUIControl Focus,Stop
return


NotifyEOP:
if hStream
    if (BASS_IsPlaying(hStream)=BASS_ACTIVE_STOPPED)
        gosub Next

return


Exit:
BASS_Free()
ExitApp


#include bass.ahk


Although these examples are AutoHotkey_L ready (I only tested using the Unicode version), they won't work on the most recent versions of AuthoHotkey_L because this BASS library is not AutoHotkey_L and/or Unicode ready. If anyone is interested in a tweaked-for-unicode version, PM me and I'll send you what I have. There are only minor changes to the current library but I haven't done any significant testing on it so it's not forum ready.

Edit: Updated the Playlist example to include progress bars for the left and right channels.


Report this post
Top
 Profile  
Reply with quote  
 Post subject:
PostPosted: February 24th, 2012, 10:52 pm 
Offline

Joined: January 29th, 2009, 9:50 pm
Posts: 483
Location: Belgium
how about that unicode?
i have this:
Code:
#SingleInstance Force ; [force|ignore|off]
#Persistent ; Keeps a script permanently running
file:=A_ScriptDir "\What I Am.mp3"
msgbox,% BASS_DLLCALL      := DllCall("LoadLibrary","str",A_ScriptDir "\bass.dll")
msgbox,% DllCall(A_ScriptDir . "\bass.dll\BASS_Init",Int,-1,Int,44100,Int,0,UInt,0,UInt,0)
; VarSetCapacity(ANSItext, StrPut(file, ""))
; StrPut(text, &ANSItext, "")
msgbox,% hMedia:= DllCall(A_ScriptDir . "\bass.dll\BASS_StreamCreateFile", UInt, false, UInt, &file, UInt64,0, UInt64,0, UInt,0)
msgbox,% DllCall(A_ScriptDir . "\bass.dll\BASS_ChannelPlay", UInt,hMedia, Int,1, Int)
but never get it to work with ahk_L unicode.
hMedia is never good.
if anybody has that figuered ou i would be graetfull. :D

_________________
Stopwatch emdkplayer
the code i post falls under the: WTFYW-WTFPL license


Report this post
Top
 Profile  
Reply with quote  
 Post subject:
PostPosted: February 24th, 2012, 11:33 pm 
Offline

Joined: December 26th, 2010, 7:40 pm
Posts: 4172
Location: Awesometown, USA
At least &file, if not other parameters, should be UPtr, but if the function expects an ANSI string, you should probably use AStr, file.

_________________
Autofire, AutoClick, Toggle, SpamWindow Control Tools
Recommended: AutoHotkey_L


Report this post
Top
 Profile  
Reply with quote  
 Post subject:
PostPosted: February 25th, 2012, 9:59 am 
Offline

Joined: October 1st, 2005, 9:55 pm
Posts: 775
Location: Texas, USA
emmanuel d wrote:
how about that unicode?
i have this:

[snip]

but never get it to work with ahk_L unicode.
hMedia is never good.
if anybody has that figuered ou i would be graetfull. :D

Although I didn't try to run your code, you appear to be close.

For the most part, the BASS API supports Unicode, but not by default. You have to tell it that you want to communicate in Unicode (UTF-16). This is accomplished by including the BASS_UNICODE flag when needed.

The following is an example of the BASS_Open function from the library that has been converted to support Unicode. Of course, it won't run without the supporting library, but it will give you an idea of the changes that need to be made:

Code:
BASS_Open(p_MediaFile,p_Flags=0)
    {
    Static BASS_STREAM_AUTOFREE:=0x40000
          ,BASS_UNICODE        :=0x80000000

    ;-- Media file exist?
    IfNotExist %p_MediaFile%
        {
        outputdebug
            ,Function: %A_ThisFunc% - The media file can't be found: %p_File%

        Return False
        }

    ;-- Parameters
    if A_IsUnicode
        p_Flags|=BASS_UNICODE

    ;-- Create stream
    hStream:=DllCall("bass\BASS_StreamCreateFile"
                    ,"UInt",False                       ;-- mem (TRUE=Stream from memory)
                    ,"UInt",&p_MediaFile                ;-- file
                    ,"UInt64",0                         ;-- offset (0=Beginning)
                    ,"UInt64",0                         ;-- length (0=Use all)
                    ,"UInt",p_Flags)                    ;-- flags

    if (hStream=0)
        {
        ErrorLevel:=BASS_ErrorGetCode()
        outputdebug,
           (ltrim join`s
            Function: %A_ThisFunc% - Unable to create a stream from file:
            %p_File%
            `n-------- Error: %ErrorLevel%
           )
       
        Return False
        }

    ;-- Return the new stream's handle
    Return hStream
    }

To convert the entire library to support Unicode, just look for the API functions that use a "flag" field of some sort. Then check the documentation to see if the BASS_UNICODE flag is supported. If it is, just use the A_IsUnicode system variable to determine whether it should be included or not.

The BASS documentation can be found here:
http://www.un4seen.com/doc/

I hope this helps.


Report this post
Top
 Profile  
Reply with quote  
 Post subject:
PostPosted: February 25th, 2012, 11:03 am 
Offline

Joined: January 29th, 2009, 9:50 pm
Posts: 483
Location: Belgium
jballi wrote:
I hope this helps.
It does.
what i was missing was
Code:
BASS_UNICODE        :=0x80000000
so this wil work on both ansi and unicode:
Code:
#SingleInstance Force ; [force|ignore|off]
#Persistent ; Keeps a script permanently running
BASS_UNICODE:=0x80000000
file := A_ScriptDir "\What I Am.mp3"
msgbox,% BASS_DLLCALL      := DllCall("LoadLibrary","str",A_ScriptDir "\bass.dll")
msgbox,% DllCall(A_ScriptDir . "\bass.dll\BASS_Init",Int,-1,Int,44100,Int,0,UInt,0,UInt,0)
msgbox,% hMedia:= DllCall(A_ScriptDir . "\bass.dll\BASS_StreamCreateFile", UInt, false, UInt, &file, UInt64,0, UInt64,0, UInt,A_IsUnicode ? BASS_UNICODE : 0)
msgbox,% DllCall(A_ScriptDir . "\bass.dll\BASS_ChannelPlay", UInt,hMedia, Int,1, Int)
return

thanks alot to point this out

you can see that i do not use the library's that way i can do this in 5 lines instead of 500 :D

_________________
Stopwatch emdkplayer
the code i post falls under the: WTFYW-WTFPL license


Report this post
Top
 Profile  
Reply with quote  
 Post subject:
PostPosted: February 25th, 2012, 7:25 pm 
Offline

Joined: January 29th, 2009, 9:50 pm
Posts: 483
Location: Belgium
nimda wrote:
At least &file, if not other parameters, should be UPtr, but if the function expects an ANSI string, you should probably use AStr, file.
i tested:
Code:
hMedia:= DllCall(A_ScriptDir . "\bass.dll\BASS_StreamCreateFile", UInt, false, str,A_ScriptDir "\What I Am.mp3", UInt64,0, UInt64,0, UInt,A_IsUnicode ? BASS_UNICODE : 0)
; hMedia:= DllCall(A_ScriptDir . "\bass.dll\BASS_StreamCreateFile", UInt, false, str,file, UInt64,0, UInt64,0, UInt,A_IsUnicode ? BASS_UNICODE : 0)
;hMedia:= DllCall(A_ScriptDir . "\bass.dll\BASS_StreamCreateFile","UInt",false,A_IsUnicode ? "WStr" : "AStr",file, UInt64,0, UInt64,0, UInt,A_IsUnicode ? BASS_UNICODE : 0)
; hMedia:= DllCall(A_ScriptDir . "\bass.dll\BASS_StreamCreateFile", UInt, false, A_PtrSize ? "UPtr" : "UInt",&file, UInt64,0, UInt64,0, UInt,A_IsUnicode ? BASS_UNICODE : 0)
They all work in ahk_L
thx Nimda for pointing to it.

_________________
Stopwatch emdkplayer
the code i post falls under the: WTFYW-WTFPL license


Report this post
Top
 Profile  
Reply with quote  
 Post subject:
PostPosted: February 28th, 2012, 4:40 pm 
Offline

Joined: May 31st, 2008, 3:22 pm
Posts: 47
anybody can add to script checkbox & slide?

1. Loop
2. Reverb
3. Random (Shuffle)
4. Panarama Channel (Left\Right)


Report this post
Top
 Profile  
Reply with quote  
Display posts from previous:  Sort by  
Post new topic Reply to topic  [ 10 posts ] 

All times are UTC [ DST ]


Who is online

Users browsing this forum: Bing [Bot], Stigg and 19 guests


You can post new topics in this forum
You can reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot post attachments in this forum

Search for:
Powered by phpBB® Forum Software © phpBB Group