Воспроизведение 16-канального аудио alsa с использованием плагина dshare зависает в функции опроса на /dev/snd/timer

Решение:

perl -lape '$\=/,/?"":"\n"' list.txt

Пояснение:

Устанавливает разделитель выходных записей $\на пустую строку "", если строка содержит запятую; сбрасывает его на \n, в противном случае (разделитель выходных записей — это то, что отделяет одну строку от другой в выходных данных; в Unix это обычно перевод строки ). Эквивалент более длинного и легко читаемого:

perl -lape '(/,/) ? ($\="") : ($\="\n")' list.txt

или аналогично:

perl -lape 'if (/,/) {$\=""} else {$\="\n"}' list.txt

Комментарии:

Причина, по которой sedне делает того, что ожидал OP, заключается в том, что он удаляет разделитель записей перед работой со строкой и возвращает его после этого. Разделителем записей по умолчанию является "\n", для замены не найдено "\n". Я выбрал perl, потому что знаю, что разделитель записей представлен как специальная переменная, которой можно явно манипулировать.

Мое решение основано на размещенном входном образце и желаемом результате. Я не думаю, что это отвечает на вопрос в заголовке:Замените запятую на новую строку, следующую только за командой и пробелом . Я читал это много раз, но эти слова просто не образуют для меня значимой последовательности.

Изменить -более простое решение:

perl -pe 's/,\n/,/' list.txt

Это то, что я предложил в комментариях, и я подумал, что также добавлю это к ответу. Несмотря на то, что он краткий и непосредственный, какой смысл использовать perl, если вы не можете продемонстрировать какую-нибудь маленькую -известную специальную переменную и неясный синтаксис?;-P

0
18.02.2020, 06:38
1 ответ

после некоторой отладки драйверов ядра ядра ядра PCM и соответствующего контроллера sdma, который использует ядро ​​dma ядра pcm, я обнаружил, что передача DMA между контроллером DMA (/drivers/dma/imx -sdma.c )и SAI FIFO (/sound/soc/fsl/fsl _sai.c )останавливались, когда количество каналов было 16 и ширина канала 32 бита. Размер буфера DMA, указанный в файле asound.conf, также имеет значение.

Обработчик прерываний контроллера Sdma — это тот, который увеличивает значение HW.ptr, упомянутое в моем вопросе выше. Обработчик прерывания SDMA запускает таймер, созданный пользовательским пространством alsa, и пользовательское пространство ожидает этого таймера в функции опроса (, здесь он застрял ), чтобы его очистить, чтобы он знал, сколько буферов для записи в отображаемый буфер памяти dma.

Поскольку обработчик прерывания dma никогда не срабатывал, HW.ptr никогда не обновлялся, и обработчик прерывания таймера также никогда не срабатывал, что приводило к тому, что пользовательское пространство ждало в функции опроса и никогда не возвращалось.

Возможно, это не окончательное решение, но в зависимости от отдельных ситуаций решением может быть либо исправление в микропрограмме/сценарии контроллера dma, либо способ работы периферийных FIFO, подключенных к контроллеру dma. в любом случае необходимо понимание базовой реализации HW IP на данном процессоре.

0
28.04.2021, 23:23

Теги

Похожие вопросы