/*----------------------------------------------------------------------------
  ChucK Strongly-timed Audio Programming Language
    Compiler, Virtual Machine, and Synthesis Engine

  Copyright (c) 2003 Ge Wang and Perry R. Cook. All rights reserved.
    http://chuck.stanford.edu/
    http://chuck.cs.princeton.edu/

  This program is free software; you can redistribute it and/or modify
  it under the dual-license terms of EITHER the MIT License OR the GNU
  General Public License (the latter as published by the Free Software
  Foundation; either version 2 of the License or, at your option, any
  later version).

  This program is distributed in the hope that it will be useful and/or
  interesting, but WITHOUT ANY WARRANTY; without even the implied warranty
  of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  MIT Licence and/or the GNU General Public License for details.

  You should have received a copy of the MIT License and the GNU General
  Public License (GPL) along with this program; a copy of the GPL can also
  be obtained by writing to the Free Software Foundation, Inc., 59 Temple
  Place, Suite 330, Boston, MA 02111-1307 U.S.A.
-----------------------------------------------------------------------------*/

//-----------------------------------------------------------------------------
// file: ulib_std.h
// desc: standard class library
//
// author: Ge Wang (ge@ccrma.stanford.edu | gewang@cs.princeton.edu)
// date: Spring 2004
//-----------------------------------------------------------------------------
#ifndef __ULIB_STD_H__
#define __ULIB_STD_H__

#include "chuck_dl.h"
#include "chuck_oo.h"

// query
DLL_QUERY libstd_query( Chuck_DL_Query * QUERY );

// exports
CK_DLL_SFUN( abs_impl );
CK_DLL_SFUN( fabs_impl );
CK_DLL_SFUN( rand_impl );
CK_DLL_SFUN( randf_impl );
CK_DLL_SFUN( rand2f_impl );
CK_DLL_SFUN( rand2_impl );
CK_DLL_SFUN( srand_impl );
CK_DLL_SFUN( sgn_impl );
CK_DLL_SFUN( system_impl );
CK_DLL_SFUN( atoi_impl );
CK_DLL_SFUN( atof_impl );
CK_DLL_SFUN( itoa_impl );
CK_DLL_SFUN( ftoa_impl );
CK_DLL_SFUN( ftoi_impl );
CK_DLL_SFUN( getenv_impl );
CK_DLL_SFUN( getenv2_impl );
CK_DLL_SFUN( setenv_impl );

CK_DLL_SFUN( mtof_impl );
CK_DLL_SFUN( ftom_impl );
CK_DLL_SFUN( powtodb_impl );
CK_DLL_SFUN( rmstodb_impl );
CK_DLL_SFUN( dbtopow_impl );
CK_DLL_SFUN( dbtorms_impl );
CK_DLL_SFUN( dbtolin_impl );
CK_DLL_SFUN( lintodb_impl );
CK_DLL_SFUN( clamp_impl );
CK_DLL_SFUN( clampf_impl );
CK_DLL_SFUN( scalef_impl );
CK_DLL_SFUN( range1_impl );
CK_DLL_SFUN( range2_impl );
CK_DLL_SFUN( range3_impl );




// forward reference
class CBufferAdvance;
struct ChucK_Object;
struct XThread;




//-----------------------------------------------------------------------------
// name: class KBHit
// desc: kbhit class
//-----------------------------------------------------------------------------
class KBHit : public Chuck_Event
{
public:
    KBHit();
    ~KBHit();

public:
    t_CKBOOL open();
    t_CKBOOL close();
    void on();
    void off();
    t_CKBOOL good() { return m_valid; }
    t_CKBOOL state() { return m_onoff; }

public:
    void set_echo( t_CKBOOL echo ) { m_echo = echo; }
    t_CKBOOL get_echo() { return m_echo; }

public:
    t_CKBOOL empty();
    t_CKINT getch();

public:
    CBufferAdvance * m_buffer;
    t_CKUINT m_read_index;
    t_CKBOOL m_valid;
    t_CKBOOL m_onoff;
    t_CKBOOL m_echo;
    Chuck_Object * SELF;
};




//-----------------------------------------------------------------------------
// name: class KBHitManager
// desc: ...
//-----------------------------------------------------------------------------
class KBHitManager
{
public:
    static t_CKBOOL init();
    static void shutdown();
    static void on();
    static void off();
    static t_CKBOOL open( KBHit * kb );
    static t_CKBOOL close( KBHit * kb );

public:
    static CBufferAdvance * the_buf;
    static t_CKINT the_onoff;
    static t_CKBOOL the_init;
    static XThread * the_thread;
};




#endif
