It might be good if I can get audio signals from IC-7410 in my rig control program. I used to use APIs provided by JACK, but this time I am trying with ALSA.
This could be a starting point for a beginner, so let’s see an example, pcm.c.
/* * Transfer method - asynchronous notification */ struct async_private_data { signed short *samples; snd_pcm_channel_area_t *areas; double phase; }; static void async_callback(snd_async_handler_t *ahandler) { snd_pcm_t *handle = snd_async_handler_get_pcm(ahandler); struct async_private_data *data = snd_async_handler_get_callback_private(ahandler); signed short *samples = data->samples; snd_pcm_channel_area_t *areas = data->areas; snd_pcm_sframes_t avail; int err; avail = snd_pcm_avail_update(handle); while (avail >= period_size) { generate_sine(areas, 0, period_size, &data->phase); err = snd_pcm_writei(handle, samples, period_size); if (err < 0) { printf("Write error: %s\n", snd_strerror(err)); exit(EXIT_FAILURE); } if (err != period_size) { printf("Write error: written %i expected %li\n", err, period_size); exit(EXIT_FAILURE); } avail = snd_pcm_avail_update(handle); } } static int async_loop(snd_pcm_t *handle, signed short *samples, snd_pcm_channel_area_t *areas) { struct async_private_data data; snd_async_handler_t *ahandler; int err, count; data.samples = samples; data.areas = areas; data.phase = 0; err = snd_async_add_pcm_handler(&ahandler, handle, async_callback, &data); if (err < 0) { printf("Unable to register async handler\n"); exit(EXIT_FAILURE); } for (count = 0; count < 2; count++) { generate_sine(areas, 0, period_size, &data.phase); err = snd_pcm_writei(handle, samples, period_size); if (err < 0) { printf("Initial write error: %s\n", snd_strerror(err)); exit(EXIT_FAILURE); } if (err != period_size) { printf("Initial write error: written %i expected %li\n", err, period_size); exit(EXIT_FAILURE); } } if (snd_pcm_state(handle) == SND_PCM_STATE_PREPARED) { err = snd_pcm_start(handle); if (err < 0) { printf("Start error: %s\n", snd_strerror(err)); exit(EXIT_FAILURE); } } /* because all other work is done in the signal handler, suspend the process */ while (1) { sleep(1); } }
Looks reasonable, isn’t it? So shall we begin?