1305 lines · 37.7 KB · C++
RawDownload
/*---------------------------------------------------------------------------- ChucK Concurrent, On-the-fly Audio Programming Language   Compiler and Virtual Machine  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 terms of the GNU General Public License 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, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for more details.  You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 U.S.A. -----------------------------------------------------------------------------*/ //-----------------------------------------------------------------------------// file: chuck.cpp// desc: chuck engine chasis; VM + compiler + state; independent of audio I/O//       REFACTOR-2017//// author: Ge Wang (https://ccrma.stanford.edu/~ge/)// date: fall 2017//// additional authors://       Jack Atherton (lja@ccrma.stanford.edu)//       Spencer Salazar (spencer@ccrma.stanford.edu)//-----------------------------------------------------------------------------#include "chuck.h"#include "chuck_errmsg.h"#include "chuck_io.h"#include "chuck_globals.h" // added 1.4.1.0 #ifndef __DISABLE_OTF_SERVER__#include "chuck_otf.h"#include "ulib_machine.h"#endif #ifndef __DISABLE_NETWORK__#include "util_network.h"#endif #include "util_string.h"#include "ugen_stk.h" #ifndef __PLATFORM_WIN32__#include <unistd.h>#include <netinet/in.h>#include <arpa/inet.h>#else#include <direct.h>      // added 1.3.0.0#endif // #ifndef __PLATFORM_WIN32__    // chuck param defaults#define CHUCK_PARAM_SAMPLE_RATE_DEFAULT            "44100"#define CHUCK_PARAM_INPUT_CHANNELS_DEFAULT         "2"#define CHUCK_PARAM_OUTPUT_CHANNELS_DEFAULT        "2"#define CHUCK_PARAM_VM_ADAPTIVE_DEFAULT            "0"#define CHUCK_PARAM_VM_HALT_DEFAULT                "0"#define CHUCK_PARAM_OTF_ENABLE_DEFAULT             "0"#define CHUCK_PARAM_OTF_PORT_DEFAULT               "8888"#define CHUCK_PARAM_DUMP_INSTRUCTIONS_DEFAULT      "0"#define CHUCK_PARAM_AUTO_DEPEND_DEFAULT            "0"#define CHUCK_PARAM_DEPRECATE_LEVEL_DEFAULT        "1"#define CHUCK_PARAM_WORKING_DIRECTORY_DEFAULT      ""#define CHUCK_PARAM_CHUGIN_ENABLE_DEFAULT          "1"#define CHUCK_PARAM_HINT_IS_REALTIME_AUDIO_DEFAULT "0"#ifndef __PLATFORM_WIN32__// 1.4.1.0 (ge) changed to ""; was "/usr/local/lib/chuck"// redundant with g_default_chugin_path, which already contains#define CHUCK_PARAM_CHUGIN_DIRECTORY_DEFAULT       ""#else // __PLATFORM_WIN32__// 1.4.1.0 (ge) changed to ""; "C:\\Program Files\\ChucK\\chugins"// redundant with g_default_chugin_path, which already contains#define CHUCK_PARAM_CHUGIN_DIRECTORY_DEFAULT       ""#endif // __PLATFORM_WIN32__#define CHUCK_PARAM_USER_CHUGINS_DEFAULT        std::list<std::string>()#define CHUCK_PARAM_USER_CHUGIN_DIRECTORIES_DEFAULT std::list<std::string>()   // chuck staticsconst char ChucK::VERSION[] = CHUCK_VERSION_STRING;t_CKUINT ChucK::o_numVMs = 0;t_CKBOOL ChucK::o_isGlobalInit = FALSE;t_CKBOOL ChucK::enableSystemCall = FALSE;    //-----------------------------------------------------------------------------// name: version()// desc: get chuck version//-----------------------------------------------------------------------------const char * ChucK::version(){    return VERSION;}    //-----------------------------------------------------------------------------// name: intSize()// desc: get chuck int size (in bits)//-----------------------------------------------------------------------------t_CKUINT ChucK::intSize(){    return machine_intsize();}    //-----------------------------------------------------------------------------// name: ChucK()// desc: constructor//-----------------------------------------------------------------------------ChucK::ChucK(){    // instantiate the carrier!    m_carrier = new Chuck_Carrier();    // set reference back to this    m_carrier->chuck = this;    // increment the numChucKs    o_numVMs++;    // initialize default params    initDefaultParams();    // did user init?    m_init = FALSE;    // did user start ChucK?    m_started = FALSE;    // zero out the hook    m_hook = NULL; // m_hook = nullptr     // global init, if needed    if( !o_isGlobalInit ) globalInit();}    //-----------------------------------------------------------------------------// name: ~ChucK()// desc: destructor//-----------------------------------------------------------------------------ChucK::~ChucK(){    // shutdown    shutdown();    // decrement the numChucKs    o_numVMs--;    // clean up the carrier    SAFE_DELETE( m_carrier );}    // REFACTOR-2017: TODO Ge: Implementation of this?//-----------------------------------------------------------------------------// name: ck_param_type// desc: enum for type of param (int, float, string)//-----------------------------------------------------------------------------enum ck_param_type{    ck_param_int, ck_param_float, ck_param_string, ck_param_string_list};    //-----------------------------------------------------------------------------// name: ck_param_types// desc: storage for types of param (int, float, string)//-----------------------------------------------------------------------------std::map< std::string, ck_param_type> ck_param_types;    //-----------------------------------------------------------------------------// name: initDefaultParams()// desc: initialize default params//-----------------------------------------------------------------------------void ChucK::initDefaultParams(){    m_params[CHUCK_PARAM_SAMPLE_RATE] = CHUCK_PARAM_SAMPLE_RATE_DEFAULT;    m_params[CHUCK_PARAM_INPUT_CHANNELS] = CHUCK_PARAM_INPUT_CHANNELS_DEFAULT;    m_params[CHUCK_PARAM_OUTPUT_CHANNELS] = CHUCK_PARAM_OUTPUT_CHANNELS_DEFAULT;    m_params[CHUCK_PARAM_VM_ADAPTIVE] = CHUCK_PARAM_VM_ADAPTIVE_DEFAULT;    m_params[CHUCK_PARAM_VM_HALT] = CHUCK_PARAM_VM_HALT_DEFAULT;    m_params[CHUCK_PARAM_OTF_ENABLE] = CHUCK_PARAM_OTF_ENABLE_DEFAULT;    m_params[CHUCK_PARAM_OTF_PORT] = CHUCK_PARAM_OTF_PORT_DEFAULT;    m_params[CHUCK_PARAM_DUMP_INSTRUCTIONS] = CHUCK_PARAM_DUMP_INSTRUCTIONS_DEFAULT;    m_params[CHUCK_PARAM_AUTO_DEPEND] = CHUCK_PARAM_AUTO_DEPEND_DEFAULT;    m_params[CHUCK_PARAM_DEPRECATE_LEVEL] = CHUCK_PARAM_DEPRECATE_LEVEL_DEFAULT;    m_params[CHUCK_PARAM_WORKING_DIRECTORY] = CHUCK_PARAM_WORKING_DIRECTORY_DEFAULT;    m_params[CHUCK_PARAM_CHUGIN_DIRECTORY] = CHUCK_PARAM_CHUGIN_DIRECTORY_DEFAULT;    m_params[CHUCK_PARAM_CHUGIN_ENABLE] = CHUCK_PARAM_CHUGIN_ENABLE_DEFAULT;    m_listParams[CHUCK_PARAM_USER_CHUGINS] = CHUCK_PARAM_USER_CHUGINS_DEFAULT;    m_listParams[CHUCK_PARAM_USER_CHUGIN_DIRECTORIES] = CHUCK_PARAM_USER_CHUGIN_DIRECTORIES_DEFAULT;    m_params[CHUCK_PARAM_HINT_IS_REALTIME_AUDIO] = CHUCK_PARAM_HINT_IS_REALTIME_AUDIO_DEFAULT;     ck_param_types[CHUCK_PARAM_SAMPLE_RATE]             = ck_param_int;    ck_param_types[CHUCK_PARAM_INPUT_CHANNELS]          = ck_param_int;    ck_param_types[CHUCK_PARAM_OUTPUT_CHANNELS]         = ck_param_int;    ck_param_types[CHUCK_PARAM_VM_ADAPTIVE]             = ck_param_int;    ck_param_types[CHUCK_PARAM_VM_HALT]                 = ck_param_int;    ck_param_types[CHUCK_PARAM_OTF_ENABLE]              = ck_param_int;    ck_param_types[CHUCK_PARAM_OTF_PORT]                = ck_param_int;    ck_param_types[CHUCK_PARAM_DUMP_INSTRUCTIONS]       = ck_param_int;    ck_param_types[CHUCK_PARAM_AUTO_DEPEND]             = ck_param_int;    ck_param_types[CHUCK_PARAM_DEPRECATE_LEVEL]         = ck_param_int;    ck_param_types[CHUCK_PARAM_WORKING_DIRECTORY]       = ck_param_string;    ck_param_types[CHUCK_PARAM_CHUGIN_DIRECTORY]        = ck_param_string;    ck_param_types[CHUCK_PARAM_CHUGIN_ENABLE]           = ck_param_int;    ck_param_types[CHUCK_PARAM_USER_CHUGINS]            = ck_param_string_list;    ck_param_types[CHUCK_PARAM_USER_CHUGIN_DIRECTORIES] = ck_param_string_list;    ck_param_types[CHUCK_PARAM_HINT_IS_REALTIME_AUDIO]  = ck_param_int;}    //-----------------------------------------------------------------------------// name: setParam()// desc: set an int param by name//-----------------------------------------------------------------------------t_CKBOOL ChucK::setParam( const std::string & name, t_CKINT value ){    if( m_params.count( name ) > 0 && ck_param_types[name] == ck_param_int )    {        std::ostringstream s;        s << value;        m_params[name] = s.str();        return TRUE;    }    else    {        return FALSE;    }}    //-----------------------------------------------------------------------------// name: setParamFloat()// desc: set a float param by name//-----------------------------------------------------------------------------t_CKBOOL ChucK::setParamFloat( const std::string & name, t_CKFLOAT value ){    if( m_params.count( name ) > 0 && ck_param_types[name] == ck_param_float )    {        std::ostringstream s;        s << value;        m_params[name] = s.str();        return TRUE;    }    else    {        return FALSE;    }}    //-----------------------------------------------------------------------------// name: setParam()// desc: set a string param by name//-----------------------------------------------------------------------------t_CKBOOL ChucK::setParam( const std::string & name, const std::string & value ){    if( m_params.count( name ) > 0 && ck_param_types[name] == ck_param_string )    {        m_params[name] = value;        return TRUE;    }    else    {        return FALSE;    }}    //-----------------------------------------------------------------------------// name: setParam()// desc: set a string list param by name//-----------------------------------------------------------------------------t_CKBOOL ChucK::setParam( const std::string & name, const std::list< std::string > & value ){    if( m_listParams.count( name ) > 0 &&        ck_param_types[name] == ck_param_string_list )    {        m_listParams[name] = value;        return TRUE;    }    else    {        return FALSE;    }}    //-----------------------------------------------------------------------------// name: getParamInt()// desc: get an int param//-----------------------------------------------------------------------------t_CKINT ChucK::getParamInt( const std::string & key ){    t_CKINT result = 0;    if( m_params.count( key ) > 0 && ck_param_types[key] == ck_param_int )    {        std::istringstream s( m_params[key] );        s >> result;    }    return result;}    //-----------------------------------------------------------------------------// name: getParamFloat()// desc: get a float param//-----------------------------------------------------------------------------t_CKFLOAT ChucK::getParamFloat( const std::string & key ){    t_CKFLOAT result = 0;    if( m_params.count( key ) > 0 && ck_param_types[key] == ck_param_float )    {        std::istringstream s( m_params[key] );        s >> result;    }    return result;}    //-----------------------------------------------------------------------------// name: getParamString()// desc: get a string param//-----------------------------------------------------------------------------std::string ChucK::getParamString( const std::string & key ){    if( m_params.count( key ) > 0 && ck_param_types[key] == ck_param_string )    {        return m_params[key];    }    else    {        return "";    }}    //-----------------------------------------------------------------------------// name: getParamStringList()// desc: get a string param//-----------------------------------------------------------------------------std::list< std::string > ChucK::getParamStringList( const std::string & key ){    if( m_listParams.count( key ) > 0 &&        ck_param_types[key] == ck_param_string_list )    {        return m_listParams[key];    }    else    {        return std::list< std::string >();    }}    //-----------------------------------------------------------------------------// name: init()// desc: initialize ChucK (using params)//-----------------------------------------------------------------------------t_CKBOOL ChucK::init(){    // sanity check    if( m_init == TRUE )    {        CK_FPRINTF_STDERR( "[chuck]: VM already initialized...\n" );        return false;    }     // initialize VM    if( !initVM() ) goto cleanup;     // initialize compiler    if( !initCompiler() ) goto cleanup;     // initialize chugin system    if( !initChugins() ) goto cleanup;     // initialize OTF programming system    if( !initOTF() ) goto cleanup;     // did user init?    m_init = TRUE;     return true; cleanup:    // shutdown, dealloc    shutdown();     return false;}    //-----------------------------------------------------------------------------// name: initVM()// desc: initialize VM//-----------------------------------------------------------------------------t_CKBOOL ChucK::initVM(){    // get VM params    t_CKUINT srate = getParamInt( CHUCK_PARAM_SAMPLE_RATE );    t_CKUINT outs = getParamInt( CHUCK_PARAM_OUTPUT_CHANNELS );    t_CKUINT ins = getParamInt( CHUCK_PARAM_INPUT_CHANNELS );    t_CKUINT adaptiveSize = getParamInt( CHUCK_PARAM_VM_ADAPTIVE );    t_CKBOOL halt = getParamInt( CHUCK_PARAM_VM_HALT ) != 0;     // instantiate VM    m_carrier->vm = new Chuck_VM();    // reference back to carrier    m_carrier->vm->setCarrier( m_carrier );    // initialize VM    if( !m_carrier->vm->initialize( srate, outs, ins, adaptiveSize, halt ) )    {        CK_FPRINTF_STDERR( "[chuck]: %s\n", m_carrier->vm->last_error() );        return false;    }     return true;}    //-----------------------------------------------------------------------------// name: initCompiler()// desc: initialize compiler//-----------------------------------------------------------------------------t_CKBOOL ChucK::initCompiler(){    // get compiler params    t_CKBOOL dump = getParamInt( CHUCK_PARAM_DUMP_INSTRUCTIONS ) != 0;    t_CKBOOL auto_depend = getParamInt( CHUCK_PARAM_AUTO_DEPEND ) != 0;    t_CKUINT deprecate = getParamInt( CHUCK_PARAM_DEPRECATE_LEVEL );    std::string workingDir = getParamString( CHUCK_PARAM_WORKING_DIRECTORY );     // log    EM_log( CK_LOG_SYSTEM, "initializing compiler..." );    // push indent level    EM_pushlog();     // instantiate compiler    m_carrier->compiler = new Chuck_Compiler();    // reference back to carrier    m_carrier->compiler->setCarrier( m_carrier );     // initialize compiler    if( !m_carrier->compiler->initialize() )    {        CK_FPRINTF_STDERR( "[chuck]: compiler failed to initialize...\n" );        return false;    }    // set dump flag    m_carrier->compiler->emitter->dump = dump;    // set auto depend flag (for type checker) | currently must be FALSE    m_carrier->compiler->set_auto_depend( auto_depend );    // set deprecation level    m_carrier->env->deprecate_level = deprecate;

Lines 1–500 of 1305.

Keyboard shortcuts

General

Show keyboard shortcuts
?
Focus the current search
/

Issues and pull requests

Open filters
f

Issues, pull requests and Inbox

Select next item
j↓
Select previous item
k↑
Open selected item
Enter
Dismiss filters or clear selection
Esc

Repository code

Go to file
t