int audioport_process (uint32_t nframes, void *arg) { int s; float *buffer; kr_audioport_t *audioport; static int32_t total_frames = 0; total_frames += nframes; if (total_frames > 35000) { krad_tone_add_preset (krad_tone, "dialtone"); krad_tone_add_preset (krad_tone2, "6"); total_frames = 0; } audioport = (kr_audioport_t *)arg; buffer = kr_audioport_get_buffer (audioport, 0); if (1) { krad_tone_run (krad_tone, buffer, nframes); buffer = kr_audioport_get_buffer (audioport, 1); krad_tone_run (krad_tone2, buffer, nframes); } else { for (s = 0; s < 1600; s++) { if (buffer[s] > 0.3) { printf("signals!\n"); break; } } } return 0; }
static int krad_mixer_process (uint32_t nframes, krad_mixer_t *krad_mixer) { int p, m; void *client; client = NULL; krad_mixer_portgroup_t *portgroup = NULL; krad_mixer_portgroup_t *mixbus = NULL; krad_mixer_crossfade_group_t *crossfade_group = NULL; krad_mixer_update_portgroups (krad_mixer); if (krad_mixer->push_tone != NULL) { krad_tone_add_preset (krad_mixer->tone_port->io_ptr, krad_mixer->push_tone); krad_mixer->push_tone = NULL; } // Gets input/output port buffers for (p = 0; p < KRAD_MIXER_MAX_PORTGROUPS; p++) { portgroup = krad_mixer->portgroup[p]; if ((portgroup != NULL) && (portgroup->active == 2) && ((portgroup->direction == INPUT) || (portgroup->direction == OUTPUT))) { portgroup_update_samples (portgroup, nframes); } } for (p = 0; p < KRAD_MIXER_MAX_PORTGROUPS / 2; p++) { crossfade_group = &krad_mixer->crossfade_group[p]; if ((crossfade_group != NULL) && ((crossfade_group->portgroup[0] != NULL) && (crossfade_group->portgroup[1] != NULL))) { if (crossfade_group->fade_easing.active) { portgroup_set_crossfade (crossfade_group->portgroup[0], krad_easing_process (&crossfade_group->fade_easing, crossfade_group->fade, &client)); krad_radio_broadcast_subunit_control ( krad_mixer->broadcaster, &crossfade_group->portgroup[0]->address, KR_CROSSFADE, crossfade_group->fade, client ); } } } for (p = 0; p < KRAD_MIXER_MAX_PORTGROUPS; p++) { portgroup = krad_mixer->portgroup[p]; if ((portgroup != NULL) && (portgroup->active == 2) && (portgroup->volume_easing.active)) { portgroup_set_volume (portgroup, krad_easing_process (&portgroup->volume_easing, portgroup->volume[0], &client)); krad_radio_broadcast_subunit_control ( krad_mixer->broadcaster, &portgroup->address, KR_VOLUME, portgroup->volume[0], client ); } } // apply volume, effects and calc peaks on inputs for (p = 0; p < KRAD_MIXER_MAX_PORTGROUPS; p++) { portgroup = krad_mixer->portgroup[p]; if ((portgroup != NULL) && (portgroup->active == 2) && (portgroup->direction == INPUT)) { portgroup_apply_volume (portgroup, nframes); //experiment if (portgroup->volume_actual[0] != 0.0f) { portgroup_apply_effects (portgroup, nframes); } krad_mixer_portgroup_compute_meters (portgroup, nframes); } } // Clear Mixes for (p = 0; p < KRAD_MIXER_MAX_PORTGROUPS; p++) { portgroup = krad_mixer->portgroup[p]; if ((portgroup != NULL) && (portgroup->active == 2) && (portgroup->io_type == MIXBUS)) { portgroup_clear_samples (portgroup, nframes); } } // Mix for (m = 0; m < KRAD_MIXER_MAX_PORTGROUPS; m++) { mixbus = krad_mixer->portgroup[m]; if ((mixbus != NULL) && (mixbus->active) && (mixbus->io_type == MIXBUS)) { for (p = 0; p < KRAD_MIXER_MAX_PORTGROUPS; p++) { portgroup = krad_mixer->portgroup[p]; if ((portgroup != NULL) && (portgroup->active == 2) && (portgroup->mixbus == mixbus) && (portgroup->direction == INPUT)) { portgroup_mix_samples ( mixbus, portgroup, nframes ); } } } } // copy to outputs, limit all outputs for (p = 0; p < KRAD_MIXER_MAX_PORTGROUPS; p++) { portgroup = krad_mixer->portgroup[p]; if ((portgroup != NULL) && (portgroup->active == 2) && (portgroup->direction == OUTPUT)) { portgroup_copy_samples ( portgroup, portgroup->mixbus, nframes ); if (portgroup->output_type == AUX) { portgroup_apply_volume (portgroup, nframes); } portgroup_limit ( portgroup, nframes ); } } if (krad_mixer->master_mix != NULL) { krad_mixer_portgroup_compute_meters (krad_mixer->master_mix, nframes); } krad_mixer->frames_since_peak_read += nframes; if (krad_mixer->frames_since_peak_read >= krad_mixer->frames_per_peak_broadcast) { krad_mixer->frames_since_peak_read = 0; for (p = 0; p < KRAD_MIXER_MAX_PORTGROUPS; p++) { portgroup = krad_mixer->portgroup[p]; if ((portgroup != NULL) && (portgroup->active == 2) && (portgroup->direction == INPUT)) { krad_mixer_portgroup_update_meter_readings (portgroup); } } if (krad_mixer->master_mix != NULL) { krad_mixer_portgroup_update_meter_readings (krad_mixer->master_mix); } } return 0; }
int main (int argc, char *argv[]) { int i; int ret; kr_client_t *client; kr_audioport_t *audioport; krad_mixer_portgroup_direction_t direction; uint32_t sample_rate; ret = 0; direction = INPUT; if (argc != 2) { if (argc > 2) { fprintf (stderr, "Only takes station argument.\n"); } else { fprintf (stderr, "No station specified.\n"); } return 1; } client = kr_client_create ("krad audioport client"); if (client == NULL) { fprintf (stderr, "Could not create KR client.\n"); return 1; } kr_connect (client, argv[1]); if (!kr_connected (client)) { fprintf (stderr, "Could not connect to %s krad radio daemon.\n", argv[1]); kr_client_destroy (&client); return 1; } if (kr_mixer_get_info_wait (client, &sample_rate, NULL) != 1) { fprintf (stderr, "Could not get mixer info!\n"); kr_client_destroy (&client); return 1; } if (direction == INPUT) { krad_tone = krad_tone_create (sample_rate); krad_tone_add_preset (krad_tone, "3"); krad_tone2 = krad_tone_create (sample_rate); krad_tone_add_preset (krad_tone2, "3"); } audioport = kr_audioport_create (client, direction); if (audioport == NULL) { fprintf (stderr, "Could not make audioport.\n"); kr_client_destroy (&client); return 1; } else { printf ("Working!\n"); } kr_audioport_set_callback (audioport, audioport_process, audioport); signal (SIGINT, signal_recv); signal (SIGTERM, signal_recv); kr_audioport_activate (audioport); for (i = 0; i < 40; i++) { usleep (30000); if (destroy == 1) { printf ("Got signal!\n"); break; } if (kr_audioport_error (audioport)) { printf ("Error: %s\n", "Audioport Error"); ret = 1; break; } } kr_audioport_deactivate (audioport); kr_audioport_destroy (audioport); if (direction == INPUT) { krad_tone_destroy (krad_tone); krad_tone_destroy (krad_tone2); } kr_client_destroy (&client); if (ret == 0) { printf ("Worked!\n"); } return ret; }