Ubuntu 22.04で音を鳴らします。
確認 1
$ ps aux | gr audio
/usr/bin/pulseaudio –daemonize=no –log-target=journal
動いている。
確認 2
$ apt list --installed | grep pulse
libpulse-dev/jammy-updates,now
入っている。
確認 2
$ type sox
無い。
install sox & run
僕が形式wavのfileを提供されていて、記事のままrawの再生をやって手間を減らしたいのでsoxを使います。
$ sudo apt install sox
使い方。
$ sox input.wav output.raw
実際は下記のようになる。
$ sox a_sound.wav a_sound.raw
source code
make_a_sound.c
#include <errno.h>
#include <stdio.h>
#include <string.h>
#include <fcntl.h>
#include <unistd.h>
#include <pulse/error.h> /* pulseaudio */
#include <pulse/simple.h> /* pulseaudio */
#define APP_NAME "pulseaudio_sample"
#define STREAM_NAME "play"
/* #define DATA_SIZE 1024 */
/* #define DATA_SIZE 65536 */
/* #define DATA_SIZE 131072 */
#define DATA_SIZE 262144
// -----------------------------------------------------------------------------
int
main()
{
int pa_errno, pa_result, read_bytes;
// -----------------------------------------------------------------------------
int fd = open( "./a_sound.raw", O_RDONLY );
// -----------------------------------------------------------------------------
pa_sample_spec ss;
ss.format = PA_SAMPLE_S16LE;
ss.rate = 48000;
ss.channels = 1;
// -----------------------------------------------------------------------------
pa_simple *pa = pa_simple_new(NULL, APP_NAME, PA_STREAM_PLAYBACK, NULL, STREAM_NAME, &ss, NULL, NULL, &pa_errno);
if (pa == NULL) {
fprintf(stderr, "ERROR: Failed to connect pulseaudio server: %s\n", pa_strerror(pa_errno));
return 1;
}
char data[DATA_SIZE];
// -----------------------------------------------------------------------------
/// get a sound !!!
read_bytes = read( fd, data, DATA_SIZE );
for (;;)
{
if ( read_bytes == 0 )
{
break;
}
else if (read_bytes < 0)
{
fprintf(stderr, "ERROR: Failed to read data from stdin: %s\n", strerror(errno));
return 1;
}
/// make a sound !!!
pa_result = pa_simple_write( pa, data, read_bytes, &pa_errno );
if ( pa_result < 0 )
{
fprintf(stderr, "ERROR: Failed to write data to pulseaudio: %s\n", pa_strerror(pa_errno));
return 1;
}
}
pa_simple_free(pa);
return 0;
}
短い音を繰り返し再生させてます。
今回の用途として本当はtimerを使って鳴らします。
build
$ gcc make_a_aound.c -lpulse -lpulse-simple
run
$ ./a.out
参考
ほぼ参考にさせていただいた下記の通りです。
やりたいことに合わせて変更しただけです。
stdioでなくfileを使う変更です。