Museum

Home

Lab Overview

Retrotechnology Articles

Online Manuals

⇒ sbe(4) — NEWS-os 4.1C

Media Vault

Software Library

Restoration Projects

Artifacts Sought

Related Articles

sbrec(1)

, sbplay(1)

, sbset(1)

, sbchk(1)

, sbconv(1)

, xsed(1)

soundlib(3x)

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

Typewritten Software • bear@typewritten.org • Edmonds, WA 98026