どのソフトを使うか

再生にはMPDを使用。問題はチャンデバソフト。 定番はBruteFIR。しかし最近のmpdではなぜかプロセスがゾンビ化してりして安定しない。 jconvolverは安定しているけど今度はjackdが安定しない。 せっかくなのでRaspberryPi2のために作ったamafirを使用することにする。 BruteFIRより低機能だが、設定不要で安定している。 OSはUbuntu15.04。14.04だとそのままではalsamixerが使えない。

出力フォーマット

amafirは入力32bit整数、出力も32bit整数で決め打ちしている。 対してXonarU7は入力はS16_LEとS24_3LEしか受け付けない。さすがに16bitだと音質劣化するので amafirの出力を24bitに変える必要がある。soxを使えば簡単だけど今回は別の方法を考える。

  1. amafirを修正して24bit出力に対応させる。
  2. 32bitを24bitに変換するソフトを作る。

1.は面倒だし、出力を何ビットにするかコマンドラインオプションで指定するか、設定ファイルを読み込ませる必要がある。だいたい24bitしか受け付けないオーディオインターフェースのほうが少ないので24bit出力には対応しないことにする。

2.は1.に比べてCPUの負荷が上がるが、最近のCPUでは全く問題にならない。

というわけで標準入力から32bit整数を受け取って24bitを出力するプログラムを作る。 構想2日、コーディング時間?分で完成。名づけてama32to24.c

#include <stdio.h>
#define N 8192 
int main(void){
  char buf1[N][4];
  char buf2[N][3];
  int ret_n;
  while(1){  
    ret_n=fread(buf1,4, N, stdin);
    int i;
    for  (i=0; i < ret_n; i++){
      buf2[i][0]=buf1[i][1];
      buf2[i][1]=buf1[i][2];
      buf2[i][2]=buf1[i][3];
    }
    fwrite(buf2, 3, ret_n, stdout);
    if (ret_n != N)
      return;
  }
}

適当なコードですが実際に動いて役に立ちます。ポインタなんか使わなくても

gcc ama32to24.c -O3 -o ama32to24

として最適化すれば十分な速度がでます。

sudo cp ama32to24 /usr/bin/

使い方はmpd.conf のpipe出力の設定を

amafir /home/hoge/amafir | ama32to24 | aplay -c 8 -f S24_3LE -r 96000 -D hw:U7,0
2015年7月10日