void SCProcess::quit() {
    OSCMessages messages;
    if (world && world->mRunning) {
        small_scpacket packet = messages.quitMessage();
        World_SendPacket(world, 8,(char*)packet.buf, null_reply_func);
    }
}
void SCProcess::sendParamChangeMessage(CFStringRef name, float value) {
    OSCMessages messages;
    if(synthName) {
        small_scpacket packet;
        size_t messageSize =messages.parameterMessage(&packet, name,value);
        World_SendPacket(world, messageSize, (char*)packet.buf, null_reply_func);
    }
}
void SCProcess::makeSynth() {
    if (world->mRunning) {
        OSCMessages messages;
        small_scpacket packet;
        size_t messageSize =  messages.createSynthMessage(&packet, synthName);
        World_SendPacket(world,messageSize,  (char*)packet.buf, null_reply_func);
    }
}
extern "C" void scsynth_android_doOsc(JNIEnv* env, jobject classobj, jobjectArray oscMessage){
    if (world->mRunning){
        small_scpacket packet;
        makePacket(env,oscMessage,packet);
        World_SendPacket(world, packet.size(),  (char*)packet.buf, androidReplyFunc);
    }else{
    	scprintf("scsynth_android_doOsc: not running!\n");
    }
}
extern "C" void scsynth_android_makeSynth(JNIEnv* env, jobject obj, jstring theName){
    if (world->mRunning){
    	jboolean isCopy;
    	const char* synthName = env->GetStringUTFChars(theName, &isCopy);
    	scprintf("scsynth_android_makeSynth(%s)\n", synthName);
        OSCMessages messages;
        small_scpacket packet;
        size_t messageSize =  messages.createSynthMessage(&packet, synthName);
        World_SendPacket(world,messageSize,  (char*)packet.buf, null_reply_func);
        env->ReleaseStringUTFChars(theName, synthName);
    }else{
    	scprintf("scsynth_android_makeSynth: not running!\n");
    }
}
Exemple #6
0
int netAddrSend(PyrObject *netAddrObj, int msglen, char *bufptr, bool sendMsgLen)
{
	int err, port, addr;

	SC_TcpClientPort* comPort = (SC_TcpClientPort*)(netAddrObj->slots + ivxNetAddr_Socket)->uptr;

	if (comPort) {
		// send TCP
		int tcpSocket = comPort->Socket();

		if (sendMsgLen) {
			// send length of message in network byte-order
			int32 sizebuf = htonl(msglen);
			sendall(tcpSocket, &sizebuf, sizeof(int32));
		}

		sendall(tcpSocket, bufptr, msglen);

	} else {
		if (gUDPport == 0) return errFailed;

		// send UDP
		err = slotIntVal(netAddrObj->slots + ivxNetAddr_Hostaddr, &addr);
		if (err) return err;

		if (addr == 0) {
#ifdef NO_INTERNAL_SERVER
      // no internal server under SC_WIN32 yet
#else
			if (gInternalSynthServer.mWorld) {
				World_SendPacket(gInternalSynthServer.mWorld, msglen, bufptr, &localServerReplyFunc);
			}
#endif
			return errNone;
		}

		err = slotIntVal(netAddrObj->slots + ivxNetAddr_PortID, &port);
		if (err) return err;

		struct sockaddr_in toaddr;
		makeSockAddr(toaddr, addr, port);

		sendallto(gUDPport->Socket(), bufptr, msglen, (sockaddr*)&toaddr, sizeof(toaddr));
	}

	return errNone;
}
void SCProcess::startUp(WorldOptions options, CFStringRef pluginsPath,  CFStringRef synthdefsPath,  int preferredPort) {

    pthread_t scThread;
    char stringBuffer[PATH_MAX] ;
    OSCMessages messages;

    CFStringGetCString(pluginsPath, stringBuffer, sizeof(stringBuffer), kCFStringEncodingUTF8);
    setenv("SC_PLUGIN_PATH", stringBuffer, 1);
    CFStringGetCString(synthdefsPath, stringBuffer, sizeof(stringBuffer), kCFStringEncodingUTF8);
    setenv("SC_SYNTHDEF_PATH", stringBuffer, 1);
    this->portNum = findNextFreeUdpPort(preferredPort);
    world = World_New(&options);
    //world->mDumpOSC=2;
    if (world) {
        if (this->portNum >= 0) World_OpenUDP(world, this->portNum);
        pthread_create (&scThread, NULL, scThreadFunc, (void*)world);
    }
    if (world->mRunning) {
        small_scpacket packet = messages.initTreeMessage();
        World_SendPacket(world, 16, (char*)packet.buf, null_reply_func);
    }
}
extern "C" int scsynth_android_start(JNIEnv* env, jobject obj, 
						jint srate, jint hwBufSize, jint numInChans, jint numOutChans, jint shortsPerSample,
						jstring pluginsPath, jstring synthDefsPath){

	jboolean isCopy;
	bufflen = shortsPerSample*numOutChans*hwBufSize;
	buff = (short*) calloc(bufflen,sizeof(short));
	const char* pluginsPath_c   = env->GetStringUTFChars(pluginsPath,   &isCopy);
	const char* synthDefsPath_c = env->GetStringUTFChars(synthDefsPath, &isCopy);
	__android_log_print(ANDROID_LOG_DEBUG, "libscsynth", "scsynth_android_start(%i, %i, %i, %i, %i, %s, %s)",
		(int)srate, (int)hwBufSize, (int)numInChans, (int)numOutChans, (int)shortsPerSample, pluginsPath_c, synthDefsPath_c);
    setenv("SC_PLUGIN_PATH",   pluginsPath_c,   1);
    setenv("SC_SYNTHDEF_PATH", synthDefsPath_c, 1);
    
    // DEBUG: Check that we can read the path
	DIR *dip;
	struct dirent *dit;
	if ((dip = opendir(pluginsPath_c)) == NULL){
		__android_log_print(ANDROID_LOG_DEBUG, "libscsynth", "Could not opendir(%s)\n", pluginsPath_c);
	}else{
		__android_log_print(ANDROID_LOG_DEBUG, "libscsynth", "OK, listing opendir(%s)\n", pluginsPath_c);
		while ((dit = readdir(dip)) != NULL){
			__android_log_print(ANDROID_LOG_DEBUG, "libscsynth", "Entry: %s\n", dit->d_name);
		}
		if (closedir(dip) == -1)
			__android_log_print(ANDROID_LOG_DEBUG, "libscsynth", "Could not closedir(%s)\n", pluginsPath_c);
	}

	env->ReleaseStringUTFChars(pluginsPath,   pluginsPath_c);
	env->ReleaseStringUTFChars(synthDefsPath, synthDefsPath_c);



	WorldOptions options = kDefaultWorldOptions;
	options.mPreferredSampleRate = srate;
	options.mPreferredHardwareBufferFrameSize = hwBufSize;
	options.mNumInputBusChannels  = numInChans;
	options.mNumOutputBusChannels = numOutChans;
	
	// Reduce things down a bit for lower-spec - these are all open for review
	options.mNumBuffers  = 512;
	options.mMaxGraphDefs = 512;
	options.mMaxWireBufs = 512;
	options.mNumAudioBusChannels = 32;
	options.mRealTimeMemorySize = 512;
	options.mNumRGens = 16;
	options.mLoadGraphDefs = 1;
	options.mVerbosity = 2; // TODO: reduce this back to zero for non-debug builds once dev't is stable
	options.mBufLength = 64; // was hwBufSize / numOutChans;
	
	
	// Similar to SCProcess:startup :
	pthread_t scThread;
	OSCMessages messages;
	
    world = World_New(&options);
    //world->mDumpOSC=2;
    if (world) {
        pthread_create (&scThread, NULL, scThreadFunc, (void*)world);
    }
    if (world->mRunning){
        small_scpacket packet = messages.initTreeMessage();
        World_SendPacket(world, 16, (char*)packet.buf, null_reply_func);
        return 0;
    }else{
    	return 1;
    }
}
void SCProcess::sendNote(int64 oscTime, int note, int velocity) {
    OSCMessages messages;
    small_scpacket packet = messages.noteMessage(oscTime, note, velocity);
    World_SendPacket(world, 92, (char*)packet.buf, null_reply_func);
}
void SCProcess::sendTick(int64 oscTime, int bus) {
    OSCMessages messages;
    small_scpacket packet = messages.sendTickMessage(oscTime, bus);
    World_SendPacket(world, 40, (char*)packet.buf, null_reply_func);

}