简体   繁体   English

ALSA的pcm_min.c示例中的警告/错误。 可能的问题?

[英]Warning/error from ALSA's pcm_min.c example. Possible problem?

When I compile ALSA's pcm_min.c example with 当我编译ALSA的pcm_min.c示例时

gcc -Wall -lasound pcm_min.c -o pcm_min

Everything is fine, but running it, I get the white noise as expected, but I also get this warning/error: 一切都很好,但运行它,我得到了预期的白噪声,但我也得到这个警告/错误:

Short write (expected 16384, wrote 7616)

Which comes from the last if-statement. 哪个来自最后的if语句。

#include <alsa/asoundlib.h>

static char *device = "default";                        /* playback device */

snd_output_t *output = NULL;
unsigned char buffer[16*1024];                          /* some random data */

int main(void)
{
        int err;
        unsigned int i;
        snd_pcm_t *handle;
        snd_pcm_sframes_t frames;

        for (i = 0; i < sizeof(buffer); i++)
                buffer[i] = random() & 0xff;

        if ((err = snd_pcm_open(&handle, device, SND_PCM_STREAM_PLAYBACK, 0)) < 0) {
                printf("Playback open error: %s\n", snd_strerror(err));
                exit(EXIT_FAILURE);
        }
        if ((err = snd_pcm_set_params(handle,
                                      SND_PCM_FORMAT_U8,
                                      SND_PCM_ACCESS_RW_INTERLEAVED,
                                      1,
                                      48000,
                                      1,
                                      500000)) < 0) {   /* 0.5sec */
                printf("Playback open error: %s\n", snd_strerror(err));
                exit(EXIT_FAILURE);
        }

        for (i = 0; i < 16; i++) {
                frames = snd_pcm_writei(handle, buffer, sizeof(buffer));
                if (frames < 0)
                        frames = snd_pcm_recover(handle, frames, 0);
                if (frames < 0) {
                        printf("snd_pcm_writei failed: %s\n", snd_strerror(err));
                        break;
                }
                if (frames > 0 && frames < (long)sizeof(buffer))
                        printf("Short write (expected %li, wrote %li)\n", (long)sizeof(buffer), frames);
        }

        snd_pcm_close(handle);
        return 0;
}

Can someone see why this warning/error occur? 有人能看出为什么会出现这种警告/错误吗?

Hugs, Louise 拥抱,露易丝

The snd_pcm_writei() function might return less than sizeof(buffer) when there's either a signal received or an underrun. 当收到信号或欠载时, snd_pcm_writei()函数可能返回小于sizeof(buffer) In your case, it seems that you're mixing bytes and frames. 在你的情况下,似乎你正在混合字节和帧。 The last parameter of the call is the number of frames that you have in your buffer. 调用的最后一个参数是缓冲区中的帧数。 Since you're passing the number of bytes in your buffer instead, you're seeing an underrun. 因为你传递了缓冲区中的字节数,所以你看到了一个欠载。

I was also having some problems with this example. 我在这个例子中也遇到了一些问题。 I modified it a bit and now it works. 我修改了一下,现在它可以工作了。

#include <stdio.h>
#include <stdlib.h>
#include <alsa/asoundlib.h>

static char *device = "default"; /* playback device */
snd_output_t *output = NULL;
unsigned char buffer[16*1024]; /* some random data */

int main(void)
{
    int err;
    unsigned int i;
    snd_pcm_t *handle;
    snd_pcm_sframes_t frames;
    snd_pcm_uframes_t bufferSize, periodSize;

    for (i = 0; i < sizeof(buffer); i++)
        buffer[i] = random() & 0xff;

    if ((err = snd_pcm_open(&handle, device, SND_PCM_STREAM_PLAYBACK, 0)) < 0) {
        printf("Playback open error: %s\n", snd_strerror(err));
        exit(EXIT_FAILURE);
    }
    if ((err = snd_pcm_set_params(handle,
                                  SND_PCM_FORMAT_S16_LE,
                                  SND_PCM_ACCESS_RW_INTERLEAVED,
                                  1, //channels
                                  44100, //sample rate
                                  1, //allow resampling
                                  500000) //required latency in us
          ) < 0) {
        printf("Playback open error: %s\n", snd_strerror(err));
        exit(EXIT_FAILURE);
    }

    if ((err = snd_pcm_prepare(handle)) < 0) {
        printf("Pcm prepare error: %s\n", snd_strerror(err));
        exit(EXIT_FAILURE);
    }

    if ((err = snd_pcm_get_params( handle, &bufferSize, &periodSize )) < 0) {
        printf("Pcm get params error: %s\n", snd_strerror(err));
        exit(EXIT_FAILURE);
    }
    printf("Buffer size:%d, Period size:%d\n", (int)bufferSize, (int)periodSize);

    for (i = 0; i < 16; i++) {
        frames = snd_pcm_writei(handle, buffer, periodSize);
        if (frames < 0)
            frames = snd_pcm_recover(handle, frames, 0);
        if (frames < 0) {
            printf("snd_pcm_writei failed: %s\n", snd_strerror(err));
            break;
        }
        if (frames > 0 && frames < (long)periodSize)
            printf("Short write (expected %li, wrote %li)\n", (long)sizeof(buffer), frames);
    }
    snd_pcm_close(handle);
    return 0;
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM