LINUX.ORG.RU

ALSA не проигрывает звук при отправке звука нулевой громкости

 ,


0

3

Симптомы такие - есть ресивер, подключается как по USB, так и по оптике через интеловскую встройку. И в линуксах есть бесячая проблема - при просмотре фильмов или прослушивании музыки если есть пауза, то поток на ресивер прерывается, а затем при появлении звука восстанавливается, что приводит к бесячим заиканиям. В винде такого поведения нету, следовательно с большой долей вероятности это не косяк ресивера. (Хотя для надежности было б хорошо повторить на отдельном USB-ЦАП).

Ну и ковырялся и доковырялся до следующего:

aplay -c 2 -r 48000 -f U24_LE /dev/zero -V stereo - поток есть (тишина с максимальной громкостью)

aplay -c 2 -r 48000 -f S24_LE /dev/zero -V stereo - потока нет, тишина с минимальной громкостью по VUmeter При этом в /proc/asound/card3/pcm0p/sub0/hw_params показывает что поток воспроизводится:

access: MMAP_INTERLEAVED
format: S32_LE
subformat: STD
channels: 2
rate: 48000 (48000/1)
period_size: 1024
buffer_size: 16384

Либо запускаю speaker-test с ключом -t wav - голос заикается

Пробовал отключать автосуспенд как в USB, так и в самой интеловской встройке - нет эффекта.

Вроде нашел что есть такой модуль module-suspend-on-idle в пульсе, но пульса отключена, демон остановлен, только голая алса

Как побороть сию напасть?

UPD: нашел костыль в виде проигрывания тона 1Гц в интерфейс но это именно костыль, хотелось бы понять, как этот автомут вообще работает…

★★★★★

Последнее исправление: eagleivg (всего исправлений: 1)

UPD: нашел костыль в виде проигрывания тона 1Гц в интерфейс но это именно костыль, хотелось бы понять, как этот автомут вообще работает…

Я уже смирился, но у меня другая причина. При запуске звукового потока при использовании hdajackretask отсылается мусорный сигнал на динамики, который звучит как удар. Поэтому я просто закинул mpv в автозапуск.

user_x
()
Ответ на: комментарий от firkax

Похоже, 1Гц синус маленькой амплитуды раз в секунду переходит через 0, поэтому срабатывает какой-то порог для отключения. А меандр можно попробовать, только сходу не нагуглил как его генерить, а писать ручками утилиту лениво.

eagleivg ★★★★★
() автор топика
Ответ на: комментарий от eagleivg

Через 0 все синусы проходят, но маленькой амплитуды на нём задерживается достаточно (видимо для засыпания) надолго из-за округления.

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <errno.h>

static signed char buf[8000];

static int write_all(int fd, signed char *b, size_t n) {
  ssize_t r;
  while(n) {
    while((r = write(fd, b, n))<0) if(r!=EINTR) return -1;
    b+=r; n-=r;
  }
  return 0;
}

int main(void) {
  pid_t fr;
  int p[2];
  if(pipe(p)<0) { fprintf(stderr, "pipe() error %d (%s)\n", errno, strerror(errno)); return -1; }
  if((fr=fork())<0) { fprintf(stderr, "fork() error %d (%s)\n", errno, strerror(errno)); return -1; }
  if(!fr) {
    if(dup2(p[0],0)<0) { fprintf(stderr,"dup2(,1) error %d (%s)\n", errno, strerror(errno)); _exit(-1); }
    close(p[0]); close(p[1]);
    execl("/usr/bin/aplay", "/usr/bin/aplay", "-f", "S8", "-r", "8000", NULL);
    fprintf(stderr, "execl() error %d (%s)\n", errno, strerror(errno));
    _exit(-1);
  }
  close(p[0]);
  memset(buf, 1, 4000);
  memset(buf+4000, -1, 4000);
  while(1) if(write_all(p[1], buf, 8000)<0) { fprintf(stderr, "write() error %d (%s)\n", errno, strerror(errno)); return -1; }
  return 0;
}

firkax ★★★★★
()
Последнее исправление: firkax (всего исправлений: 1)

Может я совсем не в кассу, ибо мимокрокодил, но на Арчвики где написано как отключить suspend для pipewire написано вроде что само устройство т.е. железка может решить что надо суспендиться. И там же вроде написано про направление постоянного звука в качестве обхода.

так что может дело именно в ресивере.. тогда надо смотреть в его дрова, есть ли там какие-то крутилки на этот счёт

mrjaggers
()
Ответ на: комментарий от mrjaggers

Смотрел, там стандартный драйвер USB Aucio Class2, настроек энергосбережения там нет. Такие настройки есть в драйвере интеграшки, но они на эту проблему не влияют.

eagleivg ★★★★★
() автор топика