Ubuntu 22.04で音を鳴らす 1

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を使う変更です。

PulseAudioで音声を再生&録音するC言語プログラム

PulseAudio 16.0





«       »