Ошибка "ioctl sndrv_pcm_ioctl_writei_frames: ресурс временно недоступен", при написании кадров в `/dev/sdd/pcmc0d0p`Linux

Ответить
Anonymous
 Ошибка "ioctl sndrv_pcm_ioctl_writei_frames: ресурс временно недоступен", при написании кадров в `/dev/sdd/pcmc0d0p`

Сообщение Anonymous »

Я пытаюсь написать программу C (на Linux), которая воспроизводит синусоидальную волну от динамиков, используя интерфейс ядра ALSA (полный код). < /p>
Моя конфигурация выглядит следующим образом: < /p>

Код: Выделить всё

set_param(params,SNDRV_PCM_HW_PARAM_ACCESS,SNDRV_PCM_ACCESS_RW_INTERLEAVED);
set_param(params,SNDRV_PCM_HW_PARAM_FORMAT,SNDRV_PCM_FORMAT_S16_LE);
set_param(params,SNDRV_PCM_HW_PARAM_CHANNELS,channels);
set_param(params,SNDRV_PCM_HW_PARAM_RATE,48000);
set_param(params,SNDRV_PCM_HW_PARAM_PERIOD_TIME,10000);
set_param(params,SNDRV_PCM_HW_PARAM_PERIODS,4);
...
sparams->tstamp_mode = SNDRV_PCM_TSTAMP_ENABLE;
sparams->period_step = 1;
sparams->avail_min = period_size;
sparams->start_threshold = ALSA_BUFFER_SIZE - period_size;
sparams->stop_threshold = ALSA_BUFFER_SIZE;
sparams->xfer_align = period_size / 2;
< /code>
И я пытаюсь воспроизводить звук здесь: < /p>
    short* samples = calloc(48000,sizeof(short));

for (int i = 0; i < 48000; i++) {
samples[i] = 30000 * sinf(2 * M_PI * 200 *((float)i / 48000));
}

void *buf=samples; unsigned int numframes=48000;

unsigned char *data = (unsigned char*)buf;
struct snd_xferi xfer = { 0 };
int ret, avail, s = 2 * 2;

__prep:
if (ioctl(fd,SNDRV_PCM_IOCTL_PREPARE) < 0) pexit("ioctl SNDRV_PCM_IOCTL_PREPARE");

do {
xfer.buf = data;
xfer.frames = numframes > period_size ? period_size : numframes;
xfer.result = 0;
if(!(ret = ioctl(fd, SNDRV_PCM_IOCTL_WRITEI_FRAMES, &xfer))) {
avail = mmap_status->hw_ptr + ALSA_BUFFER_SIZE - mmap_control->appl_ptr;
if(avail < 0) avail += boundary; else
if((unsigned int)avail >= boundary) avail -= boundary;
numframes -= xfer.result;
data += xfer.result * s;
} else  if (errno == EPIPE) goto __prep;
else {perror("ioctl SNDRV_PCM_IOCTL_WRITEI_FRAMES"); exit(1);}
} while(numframes > 0);
и после нескольких итераций цикла, программа всегда выходит с ioctl sndrv_pcm_ioctl_writei_frames: ресурс временно недоступен , без какого -либо звука. Без pulseaudio, Jack или даже Asoundlib, и я проверил, этот звук работает в виртуальной машине

Подробнее здесь: https://stackoverflow.com/questions/797 ... vailable-w
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Linux»