/'===============================================================================================
 ChannelGroups Example
 Copyright (c), Firelight Technologies Pty, Ltd 2004-2011.

 This example shows how to put channels into channel groups, so that you can affect a group
 of channels at a time instead of just one channel at a time.
==============================================================================================='/
#include "windows.bi"
#include "crt.bi"
#include "fmodex/fmodex.bi"
#include "fmodex/fmod_errors.bi"

sub ERRCHECK(byval result as FMOD_RESULT)
    if (result <> FMOD_OK) then
        printf(!"FMOD error! (%d) %s\n", result, FMOD_ErrorString(result))
        end -1
end if
    end sub

' program start
    dim as FMOD_SYSTEM  ptr fsystem
    dim as FMOD_SOUND ptr sound(5)
    dim as FMOD_CHANNEL ptr channel(5)
    dim as FMOD_CHANNELGROUP ptr groupA, groupB, masterGroup
    dim as FMOD_RESULT result
    dim as string key
dim as integer count
    dim as uinteger       version

    /'
        Create a System object and initialize.
    '/
    result = FMOD_System_Create(@fsystem)
    ERRCHECK(result)

    result = FMOD_System_GetVersion(fsystem, @version)
    ERRCHECK(result)

    if (version < FMOD_VERSION) then
        printf(!"Error!  You are using an old version of FMOD %08x.  This program requires %08x\n", version, FMOD_VERSION)
        end 0
    end if

    result = FMOD_System_Init(fsystem, 32, FMOD_INIT_NORMAL, 0)
    ERRCHECK(result)

    result = FMOD_System_CreateSound(fsystem, "media/drumloop.wav", FMOD_LOOP_NORMAL, 0, @sound(0))
    ERRCHECK(result)
    result = FMOD_System_CreateSound(fsystem, "media/jaguar.wav", FMOD_LOOP_NORMAL, 0, @sound(1))
    ERRCHECK(result)
    result = FMOD_System_CreateSound(fsystem, "media/swish.wav", FMOD_LOOP_NORMAL, 0, @sound(2))
    ERRCHECK(result)
    result = FMOD_System_CreateSound(fsystem, "media/c.ogg", FMOD_LOOP_NORMAL, 0, @sound(3))
    ERRCHECK(result)
    result = FMOD_System_CreateSound(fsystem, "media/d.ogg", FMOD_LOOP_NORMAL, 0, @sound(4))
    ERRCHECK(result)
    result = FMOD_System_CreateSound(fsystem, "media/e.ogg", FMOD_LOOP_NORMAL, 0, @sound(5))
    ERRCHECK(result)

    result = FMOD_System_CreateChannelGroup(fsystem, "Group A", @groupA)
    ERRCHECK(result)

    result = FMOD_System_CreateChannelGroup(fsystem, "Group B", @groupB)
    ERRCHECK(result)

    result = FMOD_System_GetMasterChannelGroup(fsystem, @masterGroup)
    ERRCHECK(result)

    printf(!"=======================================================================\n")
    printf(!"ChannelGroups Example.  Copyright (c) Firelight Technologies 2004-2011.\n")
    printf(!"=======================================================================\n")
    printf(!"\n")
    printf(!"Group A : drumloop.wav, jaguar.wav, swish.wav\n")
    printf(!"Group B : c.ogg, d.ogg, e.ogg\n")
    printf(!"\n")
    printf(!"Press 'A' to mute/unmute group A\n")
    printf(!"Press 'B' to mute/unmute group B\n")
    printf(!"Press 'C' to mute/unmute group A and B (master group)\n")
    printf(!"Press 'Esc' to quit\n")
    printf(!"\n")

    /'
        Instead of being independent, set the group A and B to be children of the master group.
    '/
    result = FMOD_ChannelGroup_AddGroup(masterGroup, groupA)
    ERRCHECK(result)

    result = FMOD_ChannelGroup_AddGroup(masterGroup, groupB)
    ERRCHECK(result)

    /'
        Start all the sounds!
    '/
    for count = 0 to 5
        result = FMOD_System_PlaySound(fsystem, FMOD_CHANNEL_FREE, sound(count), TRUE, @channel(count))
        ERRCHECK(result)
        if (count < 3) then
            result = FMOD_Channel_SetChannelGroup(channel(count), groupA)
        else
            result = FMOD_Channel_SetChannelGroup(channel(count), groupB)
        end if
        ERRCHECK(result)
        result = FMOD_Channel_SetPaused(channel(count), FALSE)
        ERRCHECK(result)
    next

    /'
        Change the volume of each group, just because we can!  (And makes it less of a loud noise).
    '/
    result = FMOD_ChannelGroup_SetVolume(groupA, 0.5f)
    ERRCHECK(result)
    result = FMOD_ChannelGroup_SetVolume(groupB, 0.5f)
    ERRCHECK(result)

    /'
        Main loop.
    '/
    do
key = inkey
select case key
                case "a","A" : 
                    static as integer mute = TRUE

                    FMOD_ChannelGroup_SetMute(groupA, mute)

                    mute xor= 1
                case "b","B" : 
                    static as integer mute = TRUE

                    FMOD_ChannelGroup_SetMute(groupB, mute)

                    mute xor= 1
                case "c","C" : 
                    static as integer mute = TRUE

                    FMOD_ChannelGroup_SetMute(masterGroup, mute)

                    mute xor= 1
            end select

        FMOD_System_Update(fsystem)

        scope
            dim as integer  channelsplaying = 0

            FMOD_System_GetChannelsPlaying(fsystem, @channelsplaying)

            printf(!"Channels Playing %2d\r", channelsplaying)
        end scope

        Sleep(10)

    loop while (key <> chr(27))

    printf(!"\n")

    /'
        A little fade out. (over 2 seconds)
    '/
    printf(!"Goodbye!\n")
    scope
        dim as float pitch = 1.0f
        dim as float vol = 1.0f

        for count = 0 to 200-1
            FMOD_ChannelGroup_SetPitch(masterGroup, pitch)
            FMOD_ChannelGroup_SetVolume(masterGroup, vol)

            vol   -= (1.0f / 200.0f)
            pitch -= (0.5f / 200.0f)

            Sleep(10)
        next
    end scope

    /'
        Shut down
    '/
    for count = 0 to 5
        result = FMOD_Sound_Release(sound(count))
        ERRCHECK(result)
    next

    result = FMOD_ChannelGroup_Release(groupA)
    ERRCHECK(result)
    result = FMOD_ChannelGroup_Release(groupB)
    ERRCHECK(result)

    result = FMOD_System_Close(fsystem)
    ERRCHECK(result)
    result = FMOD_System_Release(fsystem)
    ERRCHECK(result)
