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); }
/* 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; }