Example #1
0
static void
terminate(int num)
{
    // Stop outputting and generating the clock.
    if (clk_reg && gpio_reg && mbox.virt_addr) {
        // Set GPIO4 to be an output (instead of ALT FUNC 0, which is the clock).
        gpio_reg[GPFSEL0] = (gpio_reg[GPFSEL0] & ~(7 << 12)) | (1 << 12);

        // Disable the clock generator.
        clk_reg[GPCLK_CNTL] = 0x5A;
    }

    if (dma_reg && mbox.virt_addr) {
        dma_reg[DMA_CS] = BCM2708_DMA_RESET;
        udelay(10);
    }
    
    fm_mpx_close();
    close_control_pipe();

    if (mbox.virt_addr != NULL) {
        unmapmem(mbox.virt_addr, NUM_PAGES * 4096);
        mem_unlock(mbox.handle, mbox.mem_ref);
        mem_free(mbox.handle, mbox.mem_ref);
    }

    printf("Terminating: cleanly deactivated the DMA engine and killed the carrier.\n");
    
    exit(num);
}
Example #2
0
/* Simple test program */
int main(int argc, char **argv) {
    if(argc < 4) {
        fprintf(stderr, "Error: missing argument.\n");
        fprintf(stderr, "Syntax: rds_wav <in_audio.wav> <out_mpx.wav> <text>\n");
        return EXIT_FAILURE;
    }

// YLB Stuff is here
    struct rds_struct rds_status_struct;    
    struct fm_mpx_struct fm_mpx_status_struct;

    fm_mpx_status_struct.phase_38 = 0;
    fm_mpx_status_struct.phase_19 = 0;
    fm_mpx_status_struct.audio_index = 0;
    fm_mpx_status_struct.audio_len = 0;
    fm_mpx_status_struct.fir_index = 0;


    unsigned int i;
    for (i = 0; i < FIR_SIZE; i++) {
        fm_mpx_status_struct.fir_buffer_mono[i] = 0;
        fm_mpx_status_struct.fir_buffer_stereo[i] = 0;
    }


    rds_status_struct.pi = 0x1234;
    set_rds_ps(argv[3], &rds_status_struct);
    set_rds_rt(argv[3], &rds_status_struct);

// Done with YLB stuff

    //set_rds_ps(argv[3]);
    //set_rds_rt(argv[3]);
    
    char *in_file = argv[1];
    if(strcmp("NONE", argv[1]) == 0) in_file = NULL;



//  if(fm_mpx_open(in_file, LENGTH) != 0) {
    if(fm_mpx_open(in_file, LENGTH, &fm_mpx_status_struct) != 0) {
        printf("Could not setup FM mulitplex generator.\n");
        return EXIT_FAILURE;
    }
    

    
    // Set the format of the output file
    SNDFILE *outf;
    SF_INFO sfinfo;

    sfinfo.frames = LENGTH;
    sfinfo.samplerate = 228000;
    sfinfo.channels = 1;
    sfinfo.format = SF_FORMAT_WAV | SF_FORMAT_PCM_16;
    sfinfo.sections = 1;
    sfinfo.seekable = 0;
    
    // Open the output file
    char *out_file = argv[2];
    if (! (outf = sf_open(out_file, SFM_WRITE, &sfinfo))) {
        fprintf(stderr, "Error: could not open output file %s.\n", out_file);
        return EXIT_FAILURE;
    }

    float mpx_buffer[LENGTH];

    for(int j=0; j<40; j++) {
        if( fm_mpx_get_samples(mpx_buffer, &rds_status_struct, &fm_mpx_status_struct) < 0 ) break;
        
        // scale samples
        for(int i=0; i<LENGTH; i++) {
            mpx_buffer[i] /= 10.;
//            printf("%f, ", mpx_buffer[i]);
        }
        exit(0);

        if(sf_write_float(outf, mpx_buffer, LENGTH) != LENGTH) {
            fprintf(stderr, "Error: writing to file %s.\n", argv[1]);
            return EXIT_FAILURE;
        }
    }
    
    if(sf_close(outf) ) {
        fprintf(stderr, "Error: closing file %s.\n", argv[1]);
    }
    
    fm_mpx_close(&fm_mpx_status_struct);

    return EXIT_SUCCESS;
}