Пакетная обработка и запись


Пакетный режим

DpdoEngine поддерживает пакетную обработку через shell-скрипты. Отдельного флага --batch нет — достаточно цикла shell.

Пакетная конвертация в shell

Bash — пакетный FLAC → DSF:

#!/bin/bash
for f in *.flac; do
  DpdoEngine -i "$f" "${f%.flac}.dsf" --oversampling 128 --order 7
done

Рекурсивная обработка подкаталогов:

#!/bin/bash
find /music/pcm -name "*.flac" | while read f; do
  outdir="/music/dsd${f#/music/pcm}"
  mkdir -p "$(dirname "$outdir")"
  DpdoEngine -i "$f" "${outdir%.flac}.dsf" --oversampling 128 --order 7
done

Параллельная конвертация

Использование xargs или GNU parallel:

# xargs — 4 параллельных задания
find . -name "*.flac" -print0 | xargs -0 -n1 -P4 -I{} sh -c \
  'f="{}"; DpdoEngine -i "$f" "${f%.flac}.dsf" --oversampling 128 --order 7 --opencl'

# GNU parallel (рекомендуется)
find . -name "*.flac" | parallel DpdoEngine -i {} {.}.dsf --oversampling 128 --order 7

Совет: с --opencl ускорение GPU особенно эффективно в многозадачных сценариях.


Режим pipe

--pipe включает ввод/вывод через stdin/stdout для построения гибких конвейеров.

Базовое использование

# Чтение PCM из stdin, вывод в stdout
cat input.wav | DpdoEngine -i pipe output.dsf --oversampling 64 --pipe

# Совместно с ffmpeg
ffmpeg -i source.flac -f wav - | DpdoEngine -i pipe output.dsf --oversampling 128 --pipe

Примеры конвейеров

Многоступенчатая цепочка:

# PCM → нормализация громкости → шейпинг шума → DSD
ffmpeg -i track.flac -f wav - | \
  DpdoEngine -i pipe track.dsf --oversampling 128 --order 7 --lufs -16 --pipe

Мониторинг в реальном времени через DpdoPlayer:

DpdoEngine -i input.flac output.dsf --oversampling 64 --pipe | DpdoPlayer - --vol 80

Режим записи

Прямая запись с совместимых аудиоинтерфейсов. Цель — запись DSD без потерь.

Базовая запись

# Начать запись в DSF
DpdoEngine --record recording.dsf

Параметры записи

ПараметрОписаниеПример
--recordВключить запись (моно, q — стоп)--record
--record-device NAMEУстройство записи--record-device "USB Mic"
--record-samplerate HZЧастота захвата (0=авто)--record-samplerate 44100
--record-channels NКаналы (0=авто)--record-channels 2
--record-duration SECАвтостоп через SEC секунд--record-duration 300
--record-buffer NБуфер (64–65536, по умолч. 512)--record-buffer 512
--record-headroom DBЗапас по пикам дБ (по умолч. 3.0)--record-headroom 3
--list-devicesСписок устройств--list-devices

Формат вывода определяется расширением файла (.dsf / .dff).

Нативная запись DSD

Для интерфейсов с нативным выводом DSD — прямая запись потока (DoP или ALSA raw DSD):

# Режим DoP (PortAudio, широкая совместимость)
DpdoEngine --record-dsd --dsd-mode dop live.dsf

# Режим Native (ALSA raw DSD_U32_BE, требуется поддержка устройства)
DpdoEngine --record-dsd --dsd-mode native live.dsf

Записанный поток DSD не проходит через промежуточный PCM — битовый поток PDM идёт напрямую с АЦП в DSF-файл, сохраняя максимальную чистоту записи.

Запись + мониторинг

Запись с одновременным мониторингом через DpdoPlayer с нулевой задержкой:

DpdoEngine --record recording.dsf --pipe | DpdoPlayer - --vol 70

Статистика и логирование

Статистика

DpdoEngine -i input.wav output.dsf --oversampling 128 --stats

Отчёт включает: - входные/выходные частоты - время и загрузку - пиковые и RMS уровни - уровень шума - динамический диапазон

Логирование

DpdoEngine -i input.wav output.dsf --oversampling 128 2>&1 | tee conversion.log

Справочник скриптов автоматизации

Конвертация целого альбома (с метаданными)

#!/bin/bash
ALBUM="Symphony No. 9"
ARTIST="Beethoven"
YEAR=2024

for f in *.flac; do
  TITLE="${f%.flac}"
  DpdoEngine -i "$f" "${f%.flac}.dsf" \
    --oversampling 128 --order 7 \
    --artist "$ARTIST" \
    --album "$ALBUM" \
    --title "$TITLE" \
    --year "$YEAR"
done

Мониторинг папки + авто-конвертация

inotifywait -m /watch/folder -e close_write --format '%f' | while read f; do
  if [[ "$f" == *.flac || "$f" == *.wav ]]; then
    DpdoEngine -i "/watch/folder/$f" "/output/${f%.*}.dsf" --oversampling 64 --order 7
  fi
done

Одноэтапное создание альбома с DpdoPackSACD

#!/bin/bash
for f in *.flac; do
  DpdoEngine -i "$f" "${f%.flac}.dsf" --oversampling 128 --order 7 \
    --artist "Artist" --album "Album" --title "${f%.flac}"
done

DpdoPackSACD --album "Album" --artist "Artist" --cover cover.jpg *.dsf