mirror of
https://github.com/alsa-project/alsa-lib.git
synced 2025-10-29 05:40:25 -04:00
PCM loopback API improved and added back the functionality.
Some mmap() changes for the OSS emulation.
This commit is contained in:
parent
3239ca9940
commit
f5e461caa3
4 changed files with 182 additions and 34 deletions
|
|
@ -3,16 +3,75 @@
|
|||
#include <string.h>
|
||||
#include "../include/asoundlib.h"
|
||||
|
||||
#define CARD 0
|
||||
#define DEVICE 0
|
||||
#define SUBDEV 0
|
||||
#define MODE SND_PCM_LB_STREAM_MODE_PACKET
|
||||
|
||||
static void show_format1(const char *prefix, snd_pcm_format_t *format)
|
||||
{
|
||||
printf("%sinterleave = %i, rate = %i, voices = %i, format = %i\n",
|
||||
prefix,
|
||||
format->interleave ? 1 : 0,
|
||||
format->rate,
|
||||
format->voices,
|
||||
format->format);
|
||||
}
|
||||
|
||||
static void show_format(snd_pcm_loopback_t *handle)
|
||||
{
|
||||
snd_pcm_format_t format;
|
||||
int err;
|
||||
|
||||
err = snd_pcm_loopback_format(handle, &format);
|
||||
if (err < 0) {
|
||||
fprintf(stderr, "format failed: %s\n", snd_strerror(err));
|
||||
exit(0);
|
||||
}
|
||||
show_format1("Format: ", &format);
|
||||
}
|
||||
|
||||
static void data(void *private_data, char *buf, size_t count)
|
||||
{
|
||||
printf("DATA> count = %li\n", (long)count);
|
||||
}
|
||||
|
||||
static void format_change(void *private_data, snd_pcm_format_t *format)
|
||||
{
|
||||
show_format1("Format change> ", format);
|
||||
}
|
||||
|
||||
static void position_change(void *private_data, unsigned int pos)
|
||||
{
|
||||
printf("Position change> %u\n", pos);
|
||||
}
|
||||
|
||||
int main(int argc, char *argv[])
|
||||
{
|
||||
int err;
|
||||
ssize_t res;
|
||||
snd_pcm_loopback_t *handle;
|
||||
snd_pcm_loopback_callbacks_t callbacks;
|
||||
|
||||
err = snd_pcm_loopback_open(&handle, 0, 0, SND_PCM_LB_OPEN_PLAYBACK);
|
||||
err = snd_pcm_loopback_open(&handle, CARD, DEVICE, SUBDEV, SND_PCM_LB_OPEN_PLAYBACK);
|
||||
if (err < 0) {
|
||||
fprintf(stderr, "open error: %s\n", snd_strerror(err));
|
||||
exit(0);
|
||||
}
|
||||
err = snd_pcm_loopback_stream_mode(handle, MODE);
|
||||
if (err < 0) {
|
||||
fprintf(stderr, "stream mode setup failed: %s\n", snd_strerror(err));
|
||||
exit(0);
|
||||
}
|
||||
show_format(handle);
|
||||
memset(&callbacks, 0, sizeof(callbacks));
|
||||
callbacks.data = data;
|
||||
callbacks.format_change = format_change;
|
||||
callbacks.position_change = position_change;
|
||||
while ((res = snd_pcm_loopback_read(handle, &callbacks)) >= 0) {
|
||||
if (res > 0)
|
||||
printf("Read ok.. - %i\n", res);
|
||||
}
|
||||
snd_pcm_loopback_close(handle);
|
||||
return 0;
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue