Example #1
0
File: mfp_comm.c Project: wrl/mfp
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;
}
Example #2
0
File: mfp_comm.c Project: wrl/mfp
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");
    }

}
Example #3
0
File: mfp_comm.c Project: wrl/mfp
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;
}
Example #4
0
File: mfp_comm.c Project: wrl/mfp
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;
}
Example #5
0
File: main.c Project: bgribble/mfp
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);
}
Example #6
0
File: main.c Project: bgribble/mfp
/* 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;

}