int mfp_comm_connect(char * sockname) { int socket_fd; struct sockaddr_un address; struct timeval tv; tv.tv_sec = 0; tv.tv_usec = 100000; socket_fd = socket(PF_UNIX, SOCK_STREAM, 0); if (socket_fd < 0) { mfp_log_error("mfp_comm_connect: socket() failed\n"); return -1; } memset(&address, 0, sizeof(struct sockaddr_un)); address.sun_family = AF_UNIX; strncpy(address.sun_path, sockname, UNIX_PATH_MAX); if (connect(socket_fd, (struct sockaddr *)&address, sizeof(struct sockaddr_un)) < 0) { mfp_log_error("mfp_comm_connect: connect() failed, is MFP running?\n"); return -1; } setsockopt(socket_fd, SOL_SOCKET, SO_RCVTIMEO,(char *)&tv,sizeof(struct timeval)); comm_sockname = g_strdup(sockname); comm_socket = socket_fd; return socket_fd; }
static int mfp_comm_launch(char * sockname) { char mfpcmd[MFP_EXEC_SHELLMAX]; char * const execargs[4] = {"/bin/bash", "-c", mfpcmd, NULL}; snprintf(mfpcmd, MFP_EXEC_SHELLMAX-1, "mfp --no-dsp --no-default -s %s", sockname); mfp_log_debug("mfp_comm_launch: Launching main mfp process with '%s'", mfpcmd); if (comm_procpid = fork()) { mfp_log_debug("mfp_comm_launch (parent): got child PID %d", comm_procpid); mfp_log_debug("mfp_comm_launch (parent): waiting for child startup"); /* FIXME need to get some positive confirmation that MFP is up */ sleep(2); return 0; } else { execv("/bin/bash", execargs); mfp_log_error("mfp_comm_launch: exec failed\n"); printf("[LOG] ERROR:"); perror("execve"); } }
void mfp_comm_release_buffer(char * msgbuf) { /* FIXME mfp_comm_get_buffer implementation is naive */ for(int bufnum=0; bufnum < MFP_NUM_BUFFERS; bufnum++) { if(comm_buffers[bufnum].bufdata == msgbuf) { comm_buffers[bufnum].free = 1; return; } } mfp_log_error("mfp_comm_release_buffer: no matching buffer found!"); return; }
char * mfp_comm_get_buffer(void) { /* FIXME mfp_comm_get_buffer implementation is naive */ for(int bufnum=0; bufnum < MFP_NUM_BUFFERS; bufnum++) { if(comm_buffers[bufnum].free) { comm_buffers[bufnum].free = 0; return comm_buffers[bufnum].bufdata; } } mfp_log_error("mfp_comm_get_buffer: no buffers free!\n"); return NULL; }
static void sigsegv_handler(int sig, siginfo_t *si, void *unused) { void * buffer[100]; char ** strings; int nptrs, j; mfp_log_error("Segfault in C code, backend is dying"); nptrs = backtrace(buffer, 100); strings = backtrace_symbols(buffer, nptrs); for (j = 0; j < nptrs; j++) printf(" %s\n", strings[j]); free(strings); exit(-11); }
/* main() gets called only if this is a standalone JACK client * startup. The MFP process will cause this to be run */ int main(int argc, char ** argv) { char * sockname; char default_sockname[] = MFP_DEFAULT_SOCKET; int max_blocksize = 4096; int num_inputs = 2; int num_outputs = 2; mfp_context * ctxt; if (argc < 2) { printf("mfpdsp: Warning: No socket specified, using default '%s'\n", default_sockname); sockname = default_sockname; } else { sockname = argv[1]; if (argc < 3) { printf("mfpdsp: Warning: No max_blocksize specified, using default '%d'\n", max_blocksize); } else { max_blocksize = strtod(argv[2], NULL); if (argc < 4) { printf("mfpdsp: Warning: No num_inputs specified, using default '%d'\n", num_inputs); } else { num_inputs = strtod(argv[3], NULL); if (argc < 5) { printf("mfpdsp: Warning: No num_outputs specified, using default '%d'\n", num_outputs); } else { num_outputs = strtod(argv[4], NULL); } } } } /* install SIGSEGV handlers */ struct sigaction sa; sa.sa_flags = SA_SIGINFO; sigemptyset(&sa.sa_mask); sa.sa_sigaction = sigsegv_handler; if (sigaction(SIGSEGV, &sa, NULL) == -1) { mfp_log_error("mfpdsp: ERROR: could not install SIGSEGV handler, exiting\n"); return -1; } /* set up global state */ mfp_init_all(sockname); ctxt = mfp_jack_startup("mfpdsp", num_inputs, num_outputs); mfp_context_init(ctxt); mfp_comm_io_wait(); mfp_jack_shutdown(); return 0; }