コード例 #1
0
ファイル: krad_radio_ap.c プロジェクト: dsheeler/krad_radio
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;
}
コード例 #2
0
ファイル: krad_mixer.c プロジェクト: imclab/krad_radio
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;
}
コード例 #3
0
ファイル: krad_radio_ap.c プロジェクト: dsheeler/krad_radio
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;
}