SB(4) — NEWS-OS Programmer’s Manual
名称
sb, sbe − NEWS 内蔵/拡張 オーディオインターフェース
形式
device sb0 at hb0 priority 116
device sbe0 at hb0 priority 116
解説
sb デバイスドライバを用いて、 NEWS内蔵オーディオインターフェース (NWA-033 および 本体内標準装備のオーディオインターフェース)、 拡張オーディオインターフェースボード(NWB-260)を 使うことができます。 これらのボードとデバイスドライバにより、ストレートPCMデータ(16bitおよび8bit)、 CD-I, CD-ROM XAで規定されている ADPCM 方式のオーディオデータ、 μ-law, A-law方式による対数圧縮オーディオデータ(8bit)の3種類のPCMデータの 録音/再生が可能になります。
各方式でモノラル/ステレオのデータを取り扱うことができ、 サンプリング周波数や量子化ビット数も選択することができます。
2つのボードは、ハードウェア構成が異なるため、別のメジャー番号を持ちますが、 デバイスドライバレベルのソフトウェアインターフェースは ほぼ共通になっています。 スペシャルデバイスファイル名とデバイス番号(メジャー、マイナー番号)の対応は、 以下のようになります。
ファイル名デバイス番号ボード
/dev/sb0 35,0 内蔵オーディオインターフェース
/dev/sbe0 36,0 拡張オーディオインターフェース
/dev/sbec036,1 sbedデーモンとのデータ交換用(sbe0のみ)
各ボードが取り扱うことのできるデータ形式は以下のとおりです。
サンプリング周波数37.8KHz18.9KHz9.45KHz8KHz
Straight PCM 16bit○○○○
Straight PCM 8bit ○○○○
ADPCM 8bit *−−−
ADPCM 4bit ***−
μ-law/A-law 8bit ○○○○
○ … 録音/再生可能
* … 再生のみ可能
− … サポートしない
インクルードファイル
デバイスを操作するためには以下のヘッダファイルを インクルードする必要があります。
#include <stdio.h>
#include <newsiodev/sound.h>
デバイスのオープン
open(2) システムコールによりデバイスは排他的にオープンされます。 ボードが既にopenされていた場合エラー(EBUSY)が返されます。 また、openの際に Non-Blocking I/O モードの動作を指定できます(下記)。
int sbfd;
sbfd = open("/dev/sb0", O_RDWR|O_NDELAY); /∗ Non-Blocking I/O ∗/
リード/ライト
read(2) システムコールによりハードウェアは録音を開始します。 データ転送が間に合わずにデータを取りこぼした場合、 システムコールはエラー(EIO)になります。 また、readが終了したあともSBIOCABORTやSBIOCRESETを用いて停止させないかぎり、 ハードウェアは動き続け、しばらくするとFIFOがFULL状態になって ハードウェアは停止します。 この後に発行されたreadはエラー(EIO)となりますので、 その場合はSBIOCABORTでボードを初期化してください。 write(2) システムコールを用いて、書き出したデータの総量が32KBを越えると ハードウェアは再生をスタートします。 データの総量が32KB未満の場合、データをwriteした後 SBIOCFLUSHを発行してハードウェアをスタートさせて下さい。 Non-Blocking I/O モードの場合、システムコールがブロックされない範囲で 実際にread/writeできたバイト数が、リターン値として返されます。
int sbfd;/∗ ファイルディスクリプタ ∗/
char ∗data;/∗ データバッファへのポインタ ∗/
int cnt;/∗ read/writeバイト数 ∗/
read(sbfd, data, cnt);/∗ 録音 ∗/
write(sbfd, data, cnt);/∗ 再生 ∗/
クローズ
デバイスの使用後に close(2) を行います。 FIFO中のデータをすべて再生し終わるまでcloseは待たされます。
int sbfd;
close(sbfd);
IOCTL
SBIOCSETPARAM
SBIOCGETPARAM
デバイスの動作モードを設定(SBIOCSETPARAM)/問い合わせ(SBIOCGETPARAM)するための ioctlです。
/∗ sbparam ∗/
struct sbparam {
int sb_mode; /∗ モード ∗/
int sb_format; /∗ ADPCM ファイルフォーマット ∗/
int sb_compress; /∗ LogPCMデータ圧縮関数 ∗/
int sb_rate; /∗ サンプリング周波数 ∗/
int sb_channel; /∗ チャンネル数 ∗/
int sb_bitwidth; /∗ 量子化ビット数 ∗/
int sb_emphasis; /∗ エンファシス on/off ∗/
};
struct sbparam sbp;
ioctl(sbfd, SBIOCSETPARAM, &sbp);/∗ 設定 ∗/
ioctl(sbfd, SBIOCGETPARAM, &sbp);/∗ 問い合わせ ∗/
/∗ モード ∗/
#define ADPCM 0/∗ ADPCM ∗/
#define STRPCM1/∗ Straight PCM ∗/
#define LOGPCM2/∗ Log-PCM(μ-law/A-law) ∗/
/∗ ファイルフォーマット(ADPCMモード) ∗/
#define BSZ128 0/∗ ソニー標準サウンドデータフォーマット ∗/
#define BSZ23361/∗ CD-ROM モード2のユーザーデータ ∗/
/∗ データ圧縮関数(LOGPCMモード) ∗/
#define MULAW0/∗ μ-law ∗/
#define ALAW 1/∗ A-law ∗/
/∗ サンプリング周波数 ∗/
#define RATE8000 8000/∗ 8.00 kHz ∗/
#define RATE9450 9450/∗ 9.45 kHz ∗/
#define RATE1890018900/∗ 18.9 kHz ∗/
#define RATE3780037800/∗ 37.8 kHz ∗/
/∗ チャンネル数 ∗/
#define MONO 1/∗ MONAURAL ∗/
#define STEREO2/∗ STEREO ∗/
/∗ 量子化ビット数 ∗/
#define RES16B16/∗ 16bit ∗/
#define RES8B 8/∗ 8bit ∗/
#define RES4B 4/∗ 4bit(ADPCMモード) ∗/
/∗ エンファシス ∗/
#define EMPH_OFF0/∗ Emphasis OFF ∗/
#define EMPH_ON 1/∗ Emphasis ON ∗/
パラメータの設定/問い合わせには、 sbparam 構造体が使用されます。
sb_mode は、ボードの動作モードの区別に使用されます。 sb_format は、ADPCMモードの際のデータフォーマットを指定します。 BSZ128と指定すると、writeされたADPCMデータをソニー標準の サウンドデータフォーマットと解釈して出力します。 BSZ2336と指定すると、データを1ブロック2336バイトで構成される CD-ROM モード2のユーザーデータと解釈します。 BSZ128を指定した場合および、sbe0においてBSZ2336を指定した場合、 同時にサンプリング周波数、量子化ビット数、エンファシス、チャンネル数 が適切にセットされなければなりません。 sb_compress は、LOGPCMモードにおいてデータ圧縮関数を指定します。 sb_rate は、サンプリング周波数の指定に使用されます。 RATE8000からRATE37800までの値が指定できます。 ADPCMモードの場合、量子化ビット数8bitではRATE37800のみ、 4bitではRATE9450からRATE37800までが指定可能です。 sb_channel は、チャンネル数の指定に使用されます。 sb_bitwidth は、量子化ビット数の指定に使用されます。 STRPCMおよびADPCMモードの際は指定してください。 STRPCMではRES8B,RES16B、 ADPCMはRES4B, RES8Bが指定できます。 LOGPCMでは必ずRES8Bに設定されます。 sb_emphasis は、ADPCMモードにおいてエンファシスのOn/Offの指定をします。 なお、音声再生中に SBIOCSETPARAM を発行すると、 再生は中断されます。 再生の終了を待ちたい場合は、事前に SBIOCWAIT を発行してください。
SBIOCSETINLVL
SBIOCSETOUTLVL
SBIOCGETINLVL
SBIOCGETOUTLVL
オーディオ信号の入出力ゲイン(利得)の設定/問い合わせのためのioctlです。 パラメータは sblevel 構造体で指定します。
struct sblevel {
int sb_left;/∗ 左チャンネル ∗/
int sb_right;/∗ 右チャンネル ∗/
};
struct sblevel sbinlevel;
int gain = -12; /∗ -12dB ∗/
sbinlevel.sb_left = sbinlevel.sb_right = gain << 16;
ioctl(sbfd, SBIOCSETINLVL, &sbinlevel);
ゲインは左右それぞれ31bitの固定小数点数で表されるdB値で表現されます。 b31-b16 が整数部、 b15-b1 が小数部の2の補数表現とします。 sb0およびsbe0のマイク/スピーカーボックスによる入出力では、 0dB〜−32dBまでの0.5dBステップの値が指定できます。 sbe0のライン入力は、+7.5dB〜−10dBまでの2.5dBステップの値が指定できます。 sbe0のライン出力は0dB固定です。 LSB(b0) はミューティングビットです。ここが1になっていると、ミュート状態 (ゲインは−∞dB)を表します。 ただし、sbe0で入力セレクタをライン入力に設定した場合 (SBIOCSETINSW参照)、チャンネル毎のミューティングはできません。 両チャンネルのミューティングビットが1の時のみ、 両チャンネルのゲインが−∞dBに設定されます。 マイク/スピーカーボックスのINPUT LEVELを5、入力ゲインを0dBに設定したときに、 2Vrms(正弦波)の入力によりほぼフルスケールのデジタルデータが得られます。 また、マイク/スピーカーボックスのVOLUMEを10(最大値)、 出力ゲインを0dBに設定したときに、 フルスケールのデジタルデータにより、ほぼ2Vrms(正弦波)の出力が 得られます。
指定値と入出力ゲインの関係は、以下のようになっています。
指定値 入出力ゲイン
0x00078000+7.5dB
0x00050000+5.0dB
0x00028000+2.5dB
0x0 0dB
0xffff8000−0.5dB
0xffff0000−1.0dB
0xfffe8000−1.5dB
::
0xffe10000−31.0dB
0xffe08000−31.5dB
0xffe00000−32.0dB
::
0x???????1−∞dB
SBIOCMUTE
音声出力のON/OFFをします。 出力ゲインの設定値は変化しません。
int mflg = MUTE_ON;
ioctl(sbfd, SBIOCMUTE, &mflg);
#define MUTE_OFF0/∗ Not Muting ∗/
#define MUTE_ON 1/∗ Muting ∗/
SBIOCFLUSH
バッファ中のデータをflushします。 writeデータ量が32KB未満の場合、このioctlを発行することにより再生が始まります。 ADPCMモードの場合はすべてのデータをwriteした後で このioctlを発行することが必要です。 なお、デバイスのclose時には自動的にflushが行われます。
ioctl(sbfd, SBIOCFLUSH, 0);
SBIOCWAIT
writeした後、このioctlの発行によりバッファに残っているデータがすべて 再生し終わるまで待つことができます。
ioctl(sbfd, SBIOCWAIT, 0);
SBIOCSTART
SBIOCSTOP
バッファに残っているデータについて、再生/録音を一時停止(SBIOCSTOP)/ 再開(SBIOCSTART)するためのioctlです。 なお一時停止中でも、readを実行したり、writeの結果FIFO残量が32KBを上回ったら、 一時停止状態は解除されます。
ioctl(sbfd, SBIOCSTART, 0);
SBIOCABORT
再生/録音を停止し、ボードおよびバッファを初期化します。 設定されていたパラメータは保存されます。
ioctl(sbfd, SBIOCABORT, 0);
SBIOCRESET
ボードおよびデバイスドライバのリセットに使用されます。 リセット後は、モードLogPCM、圧縮法μlaw、サンプリング周波数8KHz、MONO、 量子化ビット数8bit、エンファシスOFFに設定され、バッファはすべてクリヤされます。 入出力ゲインはすべて0dBに、またNWS-1200/3200シリーズではモニターオフに 設定されます。
ioctl(sbfd, SBIOCRESET, 0);
SBIOCBUFRESID
バッファに残っているデータ量を、バイト単位で問い合わせます。 本ioctlで得られる値は、sb0で最大1KB、sbe0では最大4KBの誤差があります。
int resid;
ioctl(sbfd, SBIOCBUFRESID, &resid);
SBIOCBUFSIZE
バッファの総容量をバイト単位で問い合わせます。 sb0ではLOGPCMモードの際にバッファの総容量が他モードと異なります。
int bsize;
ioctl(sbfd, SBIOCBUFSIZE, &bsize);
SBIOCEMPHASIS(sbe0)
sbe0において、ADPCMモードのエンファシスをOn/Offするために使用されます。
int emphasis = EMPH_OFF;
ioctl(sbfd, SBIOCEMPHASIS, &emphasis);
#define EMPH_OFF0x0/∗ Emphasis OFF ∗/
#define EMPH_ON 0x1/∗ Emphasis ON ∗/
SBIOCSETINSW(sbe0)
SBIOCGETINSW(sbe0)
sbe0の音声入力セレクタです。 LINE入力(RCAピンジャック)またはマイク/スピーカーボックスが 選択できます。 セレクタスイッチの設定(SBIOCSETINSW)/問い合わせ(SBIOCGETINSW)が可能です。 初期値はデバイスのオープン時に、ボードの入力切り替えスイッチに従って 設定されます。
int insel = MIC_SP_BOX;
ioctl(sbfd, SBIOCSETINSW, &insel);
ioctl(sbfd, SBIOCGETINSW, &insel);
#define RCALINE 0x0/∗ RCA pin ∗/
#define MIC_SP_BOX0x1/∗ MIC/SP BOX ∗/
SBIOCSETMONSW(NWS-1200/3200シリーズ)
SBIOCGETMONSW(NWS-1200/3200シリーズ)
NWS-1200/3200シリーズでは、録音時のモニタースイッチをソフトウェアで コントロールします。 本 ioctl により、モニタースイッチの設定(SBIOCSETMONSW)/ 問い合わせ(SBIOCGETMONSW)を行うことができます。 モニタースイッチを一度 ON に設定すると、次に OFF にするまで 状態は継続されます。デバイスを close() しても設定は変わりません。 また、デバイスに対して write() を実行するかまたは SBIOCRESET を実行すると、 モニタースイッチは OFF にリセットされます。
int monit = MONITOR_ON;
ioctl(sbfd, SBIOCSETMONSW, &monit);
ioctl(sbfd, SBIOCGETMONSW, &monit);
#define MONITOR_OFF0
#define MONITOR_ON1
エラー
エラーが起こった場合、システムコールのリターン値は−1となり、 その時のエラーコードに以下のような値が返されます。
[ENXIO] - open時に指定したスペシャルデバイスが存在しない。
- ADPCMモードでデータのreadを行おうとした。
- sbed(デーモン)が存在しなかった(sbe0の場合)。
[EBUSY] デバイスが既にopenされている。
[EINVAL] - ioctlリクエスト、引数が有効でない。
- writeされたADPCMデータに誤りがありデコードができなかった。
[EINTR] システムコールがsignalによって割り込まれた。
[EFAULT] read/writeバッファが、割り当てられているアドレス範囲の外を指している。
[EIO] - read時にFIFOがオーバーフローした。
注意事項
sb0とsbe0を同時に使用することは可能ですが、 いずれか一方のボードを複数枚使用することはできません。
時間あたりのデータ転送量はチャンネル数、量子化ビット数、サンプリング周波数に 比例して大きくなります。 時間あたりのデータ転送量が大きい場合、システムの負荷やファイルシステムの状態に よっては、データ入力を取りこぼしたり、データ出力が間に合わないことがあります。 また、デバイスに write() するときは、1回に書く量をブロックサイズの 整数倍にしてください。データ出力が間に合わなかった場合、ボード内の FIFO が リセットされますが、リセット後に最初に書かれたデータのアライメントが 行なわれてないと、正常な再生ができなくなるからです。
関連ファイル
/dev/sb0 内蔵オーディオインターフェース・デバイスファイル
/dev/sbe0 拡張オーディオインターフェース・デバイスファイル
/dev/sbec0拡張オーディオインターフェース・デバイスファイル(デーモン用)
関連事項
sbrec(1), sbplay(1), sbset(1), sbchk(1), sbconv(1), xsed(1)
soundlib(3x)
NEWS-OSRelease 4.1C