/*
*     ___
*    / _ \___ _    _____ ____
*   / ___/ _ \ |/|/ / -_) __/
*  /_/   \___/__,__/\__/_/
*
*
*   Original Code by John Garrison
*   Written June 3-11,18,25 August 5, 1999
*   To be released under the LGPL
*
*   PowerSound example 3
*
*   Mostly taken from the SDL-demo mixer library
*   borrowed by Max Watson <max@blackholesun.com>
*
*   See LICENSE.TXT for more LGPL info
*
*   MIXERLIB:  An audio mixer library based on the SDL library
*   Copyright (C) 1997-1999  Sam Lantinga
*
*   This library is free software; you can redistribute it and/or
*   modify it under the terms of the GNU Library General Public
*   License as published by the Free Software Foundation; either
*   version 2 of the License, or (at your option) any later version.
*
*   This library is distributed in the hope that it will be useful,
*   but WITHOUT ANY WARRANTY; without even the implied warranty of
*   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
*   Library General Public License for more details.
*
*   You should have received a copy of the GNU Library General Public
*   License along with this library; if not, write to the Free
*   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
*
*   Sam Lantinga
*   5635-34 Springhouse Dr.
*   Pleasanton, CA 94588 (USA)
*   slouken@devolution.com
*/

#ifdef __WIN32__
#include <windows.h>
#endif

#include <stdlib.h>

#include "PowerPak/powerpak.h"
#include "PowerPak/powerdraw.h"
#include "PowerPak/powersound.h"
#include "PowerPak/powerinput.h"
#include "PowerPak/mouse.h"

static int audio_open = 0;
static PS_Sample *wave = NULL;

void CleanUp(void)
{
    if ( audio_open ) {
        PS_AudioClose();
        audio_open = 0;
    }
    if ( wave ) {
        PS_SampleFree(wave);
        wave = NULL;
    }
    PP_Quit();
}

int main(int argc, char *argv[])
{
    Uint32 audio_rate;
    Uint16 audio_format;
    Uint8 audio_channels;
    int i;
    int pan=0, depth=0;
    int done=0;

    /* Initialize variables */
    audio_rate = 22050;
    audio_format = AUDIO_S16;
    audio_channels = 2;

    /* Initialize the library */
    PP_Init();
    PD_Init();
    PS_Init();

    atexit(CleanUp);

    /* Open the audio device */
    if (PS_AudioOpen(audio_rate, audio_format, audio_channels, 4096) < 0) {
        fprintf(stderr, "Couldn't open audio: %s\n", SDL_GetError());
        exit(2);
    } else {
        // Check actual format of audio device
        PS_AudioQuery(&audio_rate, &audio_format, &audio_channels);
        printf("Opened audio at %d Hz %d bit %s\n", audio_rate,
               (audio_format&0xFF),
               (audio_channels > 1) ? "stereo" : "mono");
    }
    audio_open = 1;

    // Load a wave file
    wave = PS_SampleLoad("sample3.wav");
    if ( wave == NULL ) {
        fprintf(stderr, "Couldn't load %s: %s\n",
                argv[i], SDL_GetError());
        exit(2);
    }

    // Open a window
    PD_SetGFXMode(512, 512, 16, PD_DEFAULT);
    PD_RectFilled(DoubleBuffer, 0, 0, 511, 511, PD_CreateColor(DoubleBuffer, 0xFF, 0x00, 0x00));
    PD_ShowDoubleBuffer();

    // continuously play sound until told to quit
    while(!done)
    {
        // show graphic representation of sounds position in 2D space
        PD_RectFilled(DoubleBuffer, 0, 0, 511, 511, PD_CreateColor(DoubleBuffer, 0xFF, 0x00, 0x00));
        PD_RectFilled(DoubleBuffer, 244 + pan*2, 244 -depth*2, 268 + pan*2, 268-depth*2, PD_CreateColor(DoubleBuffer, 0x00, 0x00, 0xFF));
        PD_ShowDoubleBuffer();

        // adjust sounds current position
        PS_SamplePanSet(wave, pan);
        PS_SampleDepthSet(wave, depth);
        PS_SamplePlay(wave);

        // Take it easy while sound plays
        while ( PS_ChannelPlaying(0) ) {
            PP_Wait(30);
        }

        // Check for a mouse click and update sound position
        PI_PollMouse();
        PI_GetMouseState();
        if (PI_IsMouseButtonDown(1))
        {
                pan = MOUSE_X/2 -128;
                depth = -(MOUSE_Y/2 - 128);
        }

    }
    /* Cleanup */
    PS_Quit();
    PP_Quit();

    return 0;
}
