kr_streamer_t *kr_streamer_create (kr_streamer_params_t *params) { kr_streamer_t *streamer; uint32_t c; streamer = calloc (1, sizeof(kr_streamer_t)); streamer->params = params; streamer->params->channels = 2; streamer->params->sample_rate = 48000; streamer->client = kr_client_create ("krad streamer client"); if (streamer->client == NULL) { fprintf (stderr, "Could not create KR client.\n"); exit (1); } kr_connect (streamer->client, streamer->params->station); if (!kr_connected (streamer->client)) { fprintf (stderr, "Could not connect to %s krad radio daemon.\n", streamer->params->station); kr_client_destroy (&streamer->client); exit (1); } if (kr_compositor_get_info_wait (streamer->client, &streamer->width, &streamer->height, &streamer->fps_numerator, &streamer->fps_denominator) != 1) { fprintf (stderr, "Could not get compositor info!\n"); kr_client_destroy (&streamer->client); exit (1); } streamer->frame_size = streamer->width * streamer->height * 4; //FIXME streamer->videoport = kr_videoport_create (streamer->client, 0); if (streamer->videoport == NULL) { fprintf (stderr, "Could not make videoport.\n"); kr_client_destroy (&streamer->client); exit (1); } else { printf ("Working!\n"); } kr_videoport_set_callback (streamer->videoport, new_frame, streamer); for (c = 0; c < streamer->params->channels; c++) { streamer->audio_ring[c] = krad_ringbuffer_create (2200000); } if (params->file != NULL) { streamer->mkv = kr_mkv_create_file (params->file); } else { streamer->mkv = kr_mkv_create_stream (streamer->params->host, streamer->params->port, streamer->params->mount, streamer->params->password); } if (streamer->mkv == NULL) { fprintf (stderr, "failed to stream :/ \n"); exit (1); } streamer->vpx_enc = krad_vpx_encoder_create (streamer->params->width, streamer->params->height, streamer->fps_numerator, streamer->fps_denominator, streamer->params->video_bitrate); if (params->file != NULL) { krad_vpx_encoder_set_kf_max_dist (streamer->vpx_enc, 600); } kr_mkv_add_video_track (streamer->mkv, VP8, streamer->fps_numerator, streamer->fps_denominator, streamer->params->width, streamer->params->height); if (kr_mixer_get_info_wait (streamer->client, &streamer->params->sample_rate, NULL) != 1) { fprintf (stderr, "Could not get mixer info!\n"); kr_client_destroy (&streamer->client); exit (1); } streamer->vorbis_enc = krad_vorbis_encoder_create (streamer->params->channels, streamer->params->sample_rate, streamer->params->audio_quality); kr_mkv_add_audio_track (streamer->mkv, VORBIS, streamer->params->sample_rate, streamer->params->channels, streamer->vorbis_enc->hdrdata, 3 + streamer->vorbis_enc->header.sz[0] + streamer->vorbis_enc->header.sz[1] + streamer->vorbis_enc->header.sz[2]); //FIXME streamer->audioport = kr_audioport_create (streamer->client, "streamer2", 0); kr_audioport_set_callback (streamer->audioport, audioport_process, streamer); streamer->frame_ring = krad_ringbuffer_create (90 * sizeof(krad_frame_t *)); streamer->framepool = krad_framepool_create (streamer->width, streamer->height, 8); return streamer; }
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; }