SB(4) — NEWS-OS Programmer’s Manual
名称
sb, sbe − NEWS 内蔵/拡張 オーディオインターフェース
形式
device sb0 at hb0 priority 116
device sbe0 at hb0 priority 116
device sb0 at iop0 priority 116
device sb0 at ap0 priority 44
解説
sb デバイスドライバを用いて、 NEWS内蔵オーディオインターフェース (NWA-033 および 本体内標準装備のオーディオインターフェース)、 拡張オーディオインターフェースボード (NWB-260) を 使うことができます。
NWS-1200/1400/1500/1700/1800/3200/3400/3700
/3800/5000/5900 では、 ストレート PCM データ (16bit および 8bit)、 CD-I、CD-ROM XA で規定されている ADPCM 方式のオーディオデータ、 μ-law、A-law 方式による対数圧縮 オーディオデータ (8bit) の 3 種類の PCM データの 録音/再生が可能になります。 各方式でモノラル/ステレオのデータを取り扱うことができ、 サンプリング周波数や量子化ビット数も選択することができます。
NWS-3100 では、 ストレート PCM データ(16bit および 8bit)、 μ-law、A-law 方式による対数圧縮オーディオデータ (8bit) の 2 種類の PCM データの録音/再生が可能になります。 NWS-3100 では、各方式ともモノラルで、サンプリング周波数も 8KHz に 固定されています。 また、NWS-3100/5000/5900 では全二重動作がサポートされています。
内蔵オーディオインタフェースと拡張オーディオインタフェースは、 ハードウェア構成が異なるため、別のメジャー番号を持ちますが、 デバイスドライバレベルのソフトウェアインターフェースは ほぼ共通になっています。 スペシャルデバイスファイル名とデバイス番号 (メジャー、マイナー番号) の対応は、 以下のようになります。
ファイル名デバイス番号ボード
/dev/sb0 35,0 内蔵オーディオインターフェース
/dev/sbe0 36,0 拡張オーディオインターフェース
/dev/sbec036,1 sbed デーモンとのデータ交換用 (sbe0 のみ)
各ボードが取り扱うことのできるデータ形式は以下のとおりです。 [NWS-1200/1400/1500/1700/1800/3200/3400/3700/3800]
| サンプリング周波数 | Straight PCM | μ-law | A-law | ADPCM | ||
| 16bit | 8bit | 8bit | 8bit | 8bit | 4bit | |
| 8.000 KHz | ○ | ○ | ○ | ○ | − | − |
| 9.450 KHz | ○ | ○ | ○ | ○ | − | * |
| 18.900 KHz | ○ | ○ | ○ | ○ | − | * |
| 37.800 KHz | ○ | ○ | ○ | ○ | * | * |
[NWS-3100]
| サンプリング周波数 | Straight PCM | μ-law | A-law | ADPCM | ||
| 16bit | 8bit | 8bit | 8bit | 8bit | 4bit | |
| 8.000 KHz | ○ | ○ | ○ | ○ | − | − |
[NWS-5000/5900]
| サンプリング周波数 | Straight PCM | μ-law | A-law | ADPCM | ||
| 16bit | 8bit | 8bit | 8bit | 8bit | 4bit | |
| 8.000 KHz | ○ | ○ | ○ | ○ | − | − |
| 9.450 KHz | ○ | ○ | ○ | ○ | − | * |
| 11.025 KHz | ○ | ○ | ○ | ○ | − | − |
| 12.000 KHz | ○ | ○ | ○ | ○ | − | − |
| 16.000 KHz | ○ | ○ | ○ | ○ | − | − |
| 18.900 KHz | ○ | ○ | ○ | ○ | − | * |
| 22.050 KHz | ○ | ○ | ○ | ○ | − | − |
| 24.000 KHz | ○ | ○ | ○ | ○ | − | − |
| 32.000 KHz | ○ | ○ | ○ | ○ | − | − |
| 37.800 KHz | ○ | ○ | ○ | ○ | * | * |
| 44.056 KHz | ○ | ○ | ○ | ○ | − | − |
| 44.100 KHz | ○ | ○ | ○ | ○ | − | − |
| 48.000 KHz | ○ | ○ | ○ | ○ | − | − |
○ … 録音/再生可能
* … 再生のみ可能
− … サポートしない
インクルードファイル
デバイスを操作するためには以下のヘッダファイルを インクルードする必要があります。
#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) になります。
NWS-1200/1400/1500/1700/1800/3200/3400/3700/3800/5000/5900 では、 read が終了したあとも SBIOCABORT や SBIOCRESET を用いて 停止させないかぎり、 ハードウェアは動き続け、しばらくすると FIFO が FULL 状態になって ハードウェアは停止します。 この後に発行された read はエラー (EIO) となりますので、 その場合は SBIOCABORT でボードを初期化してください。 write(2) システムコールを用いて、書き出したデータの総量が 32 KByte (NWS-3100 では 512 Byte)を越えると ハードウェアは再生をスタートします。 データの総量がこの値以下のときは、データを 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
SBIOCRSETPARAM(NWS-5000/5900)
SBIOCRGETPARAM(NWS-5000/5900)
SBIOCWSETPARAM(NWS-5000/5900)
SBIOCWGETPARAM(NWS-5000/5900)
デバイスの動作モードを設定 (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.000 kHz ∗/
#define RATE9450 9450 /∗ 9.450 kHz ∗/
#define RATE18900 18900 /∗ 18.900 kHz ∗/
#define RATE37800 37800 /∗ 37.800 kHz ∗/
#define RATE12000 12000 /∗ 12.000 kHz ∗/
#define RATE24000 24000 /∗ 24.000 kHz ∗/
#define RATE48000 48000 /∗ 48.000 kHz ∗/
#define RATE11025 11025 /∗ 11.025 kHz ∗/
#define RATE22050 22050 /∗ 22.050 kHz ∗/
#define RATE44100 44100 /∗ 44.100 kHz ∗/
#define RATE16000 16000 /∗ 16.000 kHz ∗/
#define RATE32000 32000 /∗ 32.000 kHz ∗/
#define RATE44056 44056 /∗ 44.056 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 は、サンプリング周波数の指定に使用されます。 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 を発行してください。
NWS-3100 では、 デバイスが動作中に SBIOCSETPARAM を発行した場合、 すでにデバイスに設定されているのと同じパラメータを指定したときのみ エラーになりません。 異なるパラメータを指定すると EBUSY となります。
NWS-5000/5900 では デバイスのオープン時のモードに従って録音側、再生側の パラメータの設定/問い合わせをします。 デバイスがリードオンリー (O_RDONLY) でオープンされている場合は録音側に、 ライトオンリー (O_WRONLY) でオープンされている場合は再生側に、 リードライト (O_RDWR) でオープンされている場合は両方に 設定/問い合わせが行われます。 リードライトでオープンされているデバイスに対する問い合わせは、 録音側、再生側が同じパラメータで動作している場合のみ そのパラメータの値を返し、そうでない場合は EINVAL を返します。 設定の場合は、動作しているデバイスに対して異なるパラメータを 指定した場合は EBUSY になり、そうでない場合は、そのパラメータが設定されます。 リードライトでオープンされているデバイスのそれぞれのパラメータを 設定/問い合わせする場合は、SBIOC{R,W}{GET,SET}PARAM を使用してください。
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 固定です。
NWS-3100 では、出力は 8dB〜−8dB までの 2.0dB ステップの値が指定できます。 また、チャンネルはモノラルしか使用できないため、 構造体 sblevel のメンバ sb_left に値を設定します。 sb_right に設定された値は無視されます。 入力ゲインは固定されているため、SBIOCSETINLVL、SBIOCSETOUTLVL は サポートされていません。
NWS-5000/5900 では 入力ゲインの指定範囲が +16dB 〜 −16dB の 0.5 dB ステップとなっています。 LSB(b0) はミューティングビットです。ここが 1 になっていると、 ミュート状態 (ゲインは −∞dB) を表します。 ただし、sbe0で入力セレクタを ライン入力に設定した場合 (SBIOCSETINSW 参照)、 チャンネル毎のミューティングはできません。 両チャンネルのミューティングビットが 1 の時のみ、 両チャンネルのゲインが −∞dB に設定されます。 マイク/スピーカーボックスの INPUT LEVEL を 5、 入力ゲインを 0dB に設定したときに、 2Vrms (正弦波) の入力によりほぼフルスケールのデジタルデータが得られます。 また、マイク/スピーカーボックスの VOLUME を 10 (最大値)、 出力ゲインを 0dB に設定したときに、 フルスケールのデジタルデータにより、ほぼ 2Vrms (正弦波) の出力が 得られます。
指定値と入出力ゲインの関係は、以下のようになっています。
指定値 入出力ゲイン
0x00100000+16.0dB
0x000f8000+15.5dB
: :
0x00078000+7.5dB
: :
0x00008000+0.5dB
0x0 0dB
0xffff8000−0.5dB
0xffff0000−1.0dB
0xfffe8000−1.5dB
: :
0xffe10000−31.0dB
0xffe08000−31.5dB
0xffe00000−32.0dB
: :
0x???????1−∞dB
SBIOCGETPEAKINLVL(NWS-5000/5900)
SBIOCGETPEAKOUTLVL(NWS-5000/5900)
入/出力ピークレベルの問い合わせをします。 モノラル時は左チャネルに値が返されます。
struct sblevellevel;
ioctl(sb, SBIOCGETPEAKINLVL, &level);
ioctl(sb, SBIOCGETPEAKOUTLVL, &level);
SBIOCMUTE
音声出力の ON/OFF をします。 出力ゲインの設定値は変化しません。
int mflg = MUTE_ON;
ioctl(sbfd, SBIOCMUTE, &mflg);
#define MUTE_OFF0/∗ Not Muting ∗/
#define MUTE_ON 1/∗ Muting ∗/
SBIOCFLUSH
バッファ中のデータを flush します。 write データ量が 32KByte (NWS-3100 では 512Byte) 未満の場合、 この ioctl を発行することにより再生が始まります。 ADPCM モードの場合はすべてのデータを write した後で この ioctl を発行することが必要です。 なお、デバイスの close 時には自動的に flush が行われます。
ioctl(sbfd, SBIOCFLUSH, 0);
SBIOCWAIT
write した後、この ioctl の発行によりバッファに残っているデータがすべて 再生し終わるまで待つことができます。
ioctl(sbfd, SBIOCWAIT, 0);
SBIOCSTOP
SBIOCRSTOP
SBIOCWSTOP
バッファに残っているデータについて、再生/録音を一時停止 するための ioctl です。 SBIOCRSTOP、SBIOCWSTOP は全二重をサポートするデバイスでのみ サポートされています。 全二重をサポートするデバイスにおいて SBIOCSTOP が発行された場合は、 デバイスのオープン時のフラグに従って動作が規定されます。 すなわち、デバイスが O_RDONLY でオープンされている場合は録音側が、 O_WRONLY でオープンされている場合は再生側が、 O_RDWR でオープンされている場合は録音/再生双方のデバイスが 一時停止されます。
SBIOCRSTOP、SBIOCWSTOP はそれぞれ録音/再生を一時停止させるものです。 デバイスが O_WRONLY でオープンされているときに SBIOCRSTOP を、 デバイスが O_RDONLY でオープンされているときに SBIOCWSTOP を発行すると エラー EIO が返されます。
NWS-1200/1400/1500/1700/1800/3200/3400/3700/3800 では 一時停止中でも、read を実行したり、 write の結果 FIFO 残量が 32 KByte を 上回ったら、一時停止状態は解除されます。
ioctl(sbfd, SBIOCSTOP, 0);
ioctl(sbfd, SBIOCRSTOP, 0);
ioctl(sbfd, SBIOCWSTOP, 0);
SBIOCSTART
SBIOCRSTART
SBIOCWSTART
バッファに残っているデータについて、再生/録音を 再開するための ioctl です。 SBIOCRSTART、SBIOCWSTART は全二重をサポートするデバイスでのみ サポートされています。 全二重をサポートするデバイスにおいて SBIOCSTART が発行された場合は、 デバイスのオープン時のフラグに従って動作が規定されます。 すなわち、デバイスが O_RDONLY でオープンされている場合は録音側が、 O_WRONLY でオープンされている場合は再生側が、 O_RDWR でオープンされている場合は録音/再生双方のデバイスが 再開されます。
SBIOCRSTART、SBIOCWSTART はそれぞれ録音/再生を再開させるものです。 デバイスが O_WRONLY でオープンされているときに SBIOCRSTART を、 デバイスが O_RDONLY でオープンされているときに SBIOCWSTART を発行すると エラー EIO が返されます。
ioctl(sbfd, SBIOCSTART, 0);
ioctl(sbfd, SBIOCRSTART, 0);
ioctl(sbfd, SBIOCWSTART, 0);
SBIOCABORT
SBIOCRABORT
SBIOCWABORT
再生/録音を停止し、ボードおよびバッファを初期化します。 設定されていたパラメータは保存されます。 SBIOCRABORT、SBIOCWABORT は全二重をサポートするデバイスでのみ サポートされています。 全二重をサポートするデバイスにおいて SBIOCABORT が発行された場合は、 デバイスのオープン時のフラグに従って動作が規定されます。 すなわち、デバイスが O_RDONLY でオープンされている場合は録音側が、 O_WRONLY でオープンされている場合は再生側が、 O_RDWR でオープンされている場合は録音/再生双方のデバイスが アボートされます。 SBIOCRABORT、SBIOCWABORT はそれぞれ録音/再生をアボートするものです。 デバイスが O_WRONLY でオープンされているときに SBIOCRABORT を、 デバイスが O_RDONLY でオープンされているときに SBIOCWABORT を発行すると エラー EIO が返されます。
ただし、NWS-3100 シリーズにおいては、 必ず録音/再生双方のデバイスがアボートされます。 (録音側だけ、再生側だけをアボートすることはできません)
ioctl(sbfd, SBIOCABORT, 0);
ioctl(sbfd, SBIOCRABORT, 0);
ioctl(sbfd, SBIOCWABORT, 0);
SBIOCRESET
SBIOCRRESET
SBIOCWRESET
ボードおよびデバイスドライバのリセットに使用されます。 リセット後は、モード LogPCM、圧縮法 μlaw、サンプリング周波数 8KHz、MONO、 量子化ビット数 8bit、 エンファシス OFF に設定され、バッファはすべてクリアされます。 入出力ゲインはすべて 0dB に、また NWS-1200/3100/3200/5000/5900 ではモニタオフに 設定されます。 SBIOCRRESET、SBIOCWRESET は全二重をサポートするデバイスでのみ サポートされています。 全二重をサポートするデバイスにおいて SBIOCRESET が発行された場合は、 デバイスのオープン時のフラグに従って動作が規定されます。 すなわち、デバイスが O_RDONLY でオープンされている場合は録音側が、 O_WRONLY でオープンされている場合は再生側が、 O_RDWR でオープンされている場合は録音/再生双方のデバイスが リセットされます。 SBIOCRRESET、SBIOCWRESET はそれぞれ録音側/再生側をリセットするものです。 デバイスが O_WRONLY でオープンされているときに SBIOCRRESET を、 デバイスが O_RDONLY でオープンされているときに SBIOCWRESET を発行すると エラー EIO が返されます。
ただし、NWS-3100 シリーズにおいては、 必ず録音/再生双方のデバイスがリセットされます。 (録音側だけ、再生側だけをリセットすることはできません)
ioctl(sbfd, SBIOCRESET, 0);
ioctl(sbfd, SBIOCRRESET, 0);
ioctl(sbfd, SBIOCWRESET, 0);
SBIOCBUFRESID
SBIOCRBUFRESID
SBIOCWBUFRESID
バッファに残っているデータ量を、バイト単位で問い合わせます。 全二重をサポートしている機種では、バッファも録音用、再生用の 2 つを持っているため、それぞれに対して SBIOCRBUFRESID、SBIOCWBUFRESID をサポートしています。 全二重をサポートするデバイスにおいて SBIOCBUFRESID が発行された場合は、 デバイスのオープン時のフラグに従って動作が規定されます。 すなわち、デバイスが O_RDONLY でオープンされている場合は録音側の、 O_WRONLY でオープンされている場合は再生側の データ量を問い合わせます。 O_RDWR でオープンされている場合は録音/再生双方のバッファに残っている データ量を返します。 SBIOCRBUFRESID、SBIOCWBUFRESID はそれぞれ録音/再生用の バッファに残っているデータ数について問い合わせるものです。 デバイスが O_WRONLY でオープンされているときに SBIOCRBUFRESID を、 デバイスが O_RDONLY でオープンされているときに SBIOCWBUFRESID を発行すると エラー EIO が返されます。
本 ioctl で得られる値は、 sb0 で最大 1KByte (NWS-3100 シリーズでは 256Byte)、 sbe0 では最大 4KByte の誤差があります。
int resid;
ioctl(sbfd, SBIOCBUFRESID, &resid);
ioctl(sbfd, SBIOCRBUFRESID, &resid);
ioctl(sbfd, SBIOCWBUFRESID, &resid);
SBIOCBUFSIZE
SBIOCRBUFSIZE
SBIOCWBUFSIZE
バッファの総容量をバイト単位で問い合わせます。 全二重をサポートしている機種では、バッファも録音用、再生用の 2 つを持っているため、それぞれに対して SBIOCRBUFSIZE、SBIOCWBUFSIZE をサポートしています。 全二重をサポートするデバイスにおいて SBIOCBUFSIZE が発行された場合は、 デバイスのオープン時のフラグに従って動作が規定されます。 すなわち、デバイスが O_RDONLY でオープンされている場合は録音側の、 O_WRONLY でオープンされている場合は再生側の、 O_RDWR でオープンされている場合は録音/再生双方のバッファの 総容量を問い合わせます。 SBIOCRBUFSIZE、SBIOCWBUFSIZE はそれぞれ録音/再生用の バッファの総容量を問い合わせるものです。 デバイスが O_WRONLY でオープンされているときに SBIOCRBUFSIZE を、 デバイスが O_RDONLY でオープンされているときに SBIOCWBUFSIZE を発行すると エラー EIO が返されます。 sb0 では PCM のモードによりバッファの総容量が異なります。
int bsize;
ioctl(sbfd, SBIOCBUFSIZE, &bsize);
ioctl(sbfd, SBIOCRBUFSIZE, &bsize);
ioctl(sbfd, SBIOCWBUFSIZE, &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 ∗/
SBIOCSETLINESW(NWS-5000/5900)
SBIOCGETLINESW(NWS-5000/5900)
LINE SELECTOR 出力の設定、問い合わせをします。 LINE SELECTOR 出力としては、マイク入力、ライン入力、内蔵 CD-ROM のうちから ひとつを選択します。 初期値はマイク入力です。
int linesw = LINESW_LINE;
ioctl(sb, SBIOCSETLINESW, &linesw);
ioctl(sb, SBIOCGETLINESW, &linesw);
#define LINESW_MIC0/∗ mic ∗/
#define LINESW_LINE1/∗ line jack ∗/
#define LINESW_CDROM2/∗ cd-rom ∗/
SBIOCSETINSW(sbe0, NWS-5000/5900)
SBIOCGETINSW(sbe0, NWS-5000/5900)
入力音源セレクタです。 sbe0 においては、 LINE 入力 (RCA ピンジャック) またはマイク/スピーカーボックスが 選択できます。 NWS-5000/5900 においては、 LINE SELECTOR 出力または スロット入力が選択できます。 セレクタスイッチの設定 (SBIOCSETINSW)/問い合わせ (SBIOCGETINSW) が 可能です。 sbe0 では、 初期値はデバイスのオープン時に、ボードの入力切り替えスイッチに従って 設定されます。 NWS-5000/5900 での初期値は LINE SELECTOR 出力です。
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 ∗/
#define INSW_LINE0x2/∗ LINE SELECTOR output ∗/
#define INSW_SLOT0x3/∗ SLOT input ∗/
SBIOCSETINCH(NWS-5000/5900)
SBIOCGETINCH(NWS-5000/5900)
LINE SELECTOR 出力がモノラルのとき、そのまま左チャネルだけに入力するか、 あるいは両チャネルに振り分けるかの設定/問い合わせをします。 初期値はモノラルです。 SLOT からの入力に対しては無効です。 (SLOT からの入力は常にモノラルで両チャネルに振り分けられます)
int inch = INCH_STEREO;
ioctl(sb, SBIOCSETINCH, &inch);
ioctl(sb, SBIOCGETINCH, &inch);
#define INCH_MONO0/∗ mono ∗/
#define INCH_STEREO1/∗ stereo ∗/
SBIOCSETSP(NWS-5000/5900)
SBIOCGETSP(NWS-5000/5900)
NWS-5000/5900 では、出力先として 本体内蔵のスピーカとキーボード (NWP-5461) 内蔵のスピーカを 使用することができます。 このスピーカの設定/問い合わせをします。 両方のスピーカを同時に指定することも可能です。 キーボード (NWP-410/411) が接続されているときはエラー EINVAL になります。 初期値は、本体内蔵のスピーカです。
int sp = OUTSP_KB;
ioctl(sb, SBIOCSETSP, &sp);
ioctl(sb, SBIOCGETSP, &sp);
#define OUTSP_SP1
#define OUTSP_KB2
SBIOCSETSLOTOUT(NWS-5000/5900)
SBIOCGETSLOTOUT(NWS-5000/5900)
本体のスロットへ出力する音源の設定/問い合わせをします。 スロットへ出力する音源は、D/A コンバータの出力、あるいは MON_LINE 出力のどちらかを選択することができます。
int slotout = SLOTOUT_DA;
ioctl(sb, SBIOCSETSLOTOUT, &slotout);
ioctl(sb, SBIOCGETSLOTOUT, &slotout);
#define SLOTOUT_DA0
#define SLOTOUT_LINE1
SBIOCSETMON(NWS-5000/5900)
SBIOCGETMON(NWS-5000/5900)
NWS-5000/5900 では 3 種類のモニタを使用することができます。
MON_LINE: LINE SELECTOR 出力のモニタ
MON_MON: 実際に録音されたデータのモニタ
MON_SLOT: SLOT 入力のモニタ
この ioctl ではこれらのモニタの設定/問い合わせをします。 MON_MON が選択され、ON になっている場合は再生側は音が出なくなります。 MON_LINE と MON_SLOT は SBIOCSETINSW で選択されたものとは 無関係にモニタすることができます。 ただし、SBIOCSETINSW で INSW_LINE が選択されている場合は MON_LINE と MON_MON を、INSW_SLOT が選択されている場合は MON_SLOT と MON_MON を同時に選択することはできません。 すなわち、MON_MON が選択されているときは、入力されている 音源と同じ側のモニタは mute されます。 このような条件で選択された場合にはエラー EINVAL になります。 デバイスの出力側が動作中に MON_MON を選択しようとすると エラー (EBUSY) がかえります。 この ioctl で選択しただけではモニタは ON になりません。 選択したあと SBIOCSETMONSW でモニタを ON にする必要があります。 モニタを選択し直した場合は、モニタは一旦 OFF になります。 初期値は MON_LINE です。
int mon = MON_MON;
ioctl(sb, SBIOCSETMON, &mon)
ioctl(sb, SBIOCGETMON, &mon)
#define MON_LINE1
#define MON_MON2
#define MON_SLOT4
SBIOCSETMONLINELVL(NWS-5000/5900)
SBIOCGETMONLINELVL(NWS-5000/5900)
MON_LINE モニタのレベルの設定/問い合わせをします。 設定できる値は、0 dB 〜 -32 dB で 0.5 dB ステップです。
struct sblevel level;
ioctl(sb, SBIOCSETMONLINELVL, &level)
ioctl(sb, SBIOCGETMONLINELVL, &level)
SBIOCSETMONMONLVL(NWS-5000/5900)
SBIOCGETMONMONLVL(NWS-5000/5900)
MON_MON モニタのレベルの設定/問い合わせをします。 設定できる値は、0 dB 〜 -32 dB で 0.5 dB ステップです。
struct sblevel level;
ioctl(sb, SBIOCSETMONMONLVL, &level)
ioctl(sb, SBIOCGETMONMONLVL, &level)
SBIOCSETMONSLOTLVL(NWS-5000/5900)
SBIOCGETMONSLOTLVL(NWS-5000/5900)
MON_SLOT モニタのレベルの設定/問い合わせをします。 設定できる値は、0 dB 〜 -32 dB で 0.5 dB ステップです。
struct sblevel level;
ioctl(sb, SBIOCSETMONSLOTLVL, &level)
ioctl(sb, SBIOCGETMONSLOTLVL, &level)
SBIOCSETMONSW(NWS-1200/3100/3200/5000/5900)
SBIOCGETMONSW(NWS-1200/3100/3200/5000/5900)
NWS-1200/3100/3200/5000/5900 では、録音時のモニタスイッチをソフトウェアで コントロールします。 本 ioctl により、モニタスイッチの設定 (SBIOCSETMONSW)/ 問い合わせ (SBIOCGETMONSW) を行うことができます。 モニタスイッチを一度 ON に設定すると、次に OFF にするまで 状態は継続されます。デバイスを close() しても設定は変わりません。 全2重をサポートしていない機種では、 デバイスに対して write() を実行するか、 または SBIOCRESET を実行すると、 モニタスイッチは OFF にリセットされます。 NWS-5000/5900 では SBIOCSETMON で選択されたモニタのみが ON/OFF されます。 SBIOCSETMON で MON_MON が選択され、SBIOCSETMONSW で ON にされて いる場合は、再生側は音が出なくなります。
int monit = MONITOR_ON;
ioctl(sbfd, SBIOCSETMONSW, &monit);
ioctl(sbfd, SBIOCGETMONSW, &monit);
#define MONITOR_OFF0
#define MONITOR_ON1
SBIOCGETSTAT (NWS-3100/5000/5900)
SBIOCGETRSTAT (NWS-5000/5900)
SBIOCGETWSTAT (NWS-5000/5900)
デバイスの状態を問い合わせることができます。 デバイスが動作している場合は SBSTAT_RUN が、停止している場合は SBSTAT_STOP が得られます。 NWS-5000/5900 においては、 SBIOCGETSTAT はデバイスのオープン時のモードに従って、 デバイスの状態を問い合わせます。 デバイスがリードオンリー (O_RDONLY) でオープンされている場合は 録音側デバイスの状態が、 ライトオンリー (O_WRONLY) でオープンされている場合は再生側デバイスの状態が 問い合わされます。 リードライト (O_RDWR) でオープンされている場合は両デバイスが 停止している場合のみ SBSTAT_STOP を返します。 リードライトでオープンされているデバイスの状態を問い合わせる場合は、 SBIOC{R,W}STAT を使用してください。
int stat;
ioctl(sbfd, SBIOCGETSTAT, &stat);
#define SBSTAT_RUN1
#define SBSTAT_STOP2
SBIOCGETPARAMTBL (NWS-3100/5000/5900)
デバイスで指定可能なパラメータの組合せテーブル中から、 指定された番号の組合せを問い合わせます。
/∗ sb parameter table ∗/
struct sbptbl {
intsbtbl_no;/∗ 番号 ∗/
struct sbparamsbtbl_param;/∗ パラメータ ∗/
};
sbruct sbptbl sbptbl;
sbptbl.sbtbl_no = 0;
ioctl(sbfd, SBIOCGETPARAMTBL, &sbptbl);/∗ 0 番の組合せの問い合わせ ∗/
問い合わせには sbptbl 構造体が使用されます。
sbptbl 構造体のメンバ sbtbl_no に問い合わせたい番号を設定して ioctl を発行すると、メンバ sbtbl_param にその組合せが返されます。 総組合せ数は、SBIOCGETNPARAMTBL で得ることができます。 sbtbl_param のうち sb_format, sb_emphasis は使用されません。
SBIOCGETNPARAMTBL (NWS-3100/5000/5900)
デバイスで指定可能なパラメータの総組合せ数を問い合わせます。
int nparam;
ioctl (sbfd, SBIOCGETNPARAMTBL, &nparam);
SBIOCGETTYPE(NWS-5000/5900)
オーディオインターフェースの種類を問い合わせます。
int type;
ioctl(sb, SBIOCGETTPYE, &type)
#define SBTYPE_AIF2 1 /∗ NWS-1400/1500/1700/1800/3400/3700/3800 ∗/
#define SBTYPE_AIF2_L 2 /∗ NWS-1200/3200 ∗/
#define SBTYPE_AIF2_E 3 /∗ sbe0 ∗/
#define SBTYPE_AIF3 4 /∗ NWS-3100 ∗/
#define SBTYPE_AIF5 5 /∗ NWS-5000/5900 ∗/
エラー
エラーが起こった場合、システムコールのリターン値は −1 となり、 その時のエラーコードに以下のような値が返されます。
[ENXIO] • open 時に指定したスペシャルデバイスが存在しない。
• ADPCM モードでデータの read を行おうとした。
• ADPCM モードでデータの write を行おうとした。(NWS-3100 シリーズの場合)
• sbed (デーモン) が存在しなかった (sbe0 の場合)。
[EBUSY] • デバイスが既に open されている。 (NWS-1200
/1400/1500/1700/1800/3200/3400/3700/3800 の場合)
• すでに設定されているのと異なるパラメータを設定しようとした。 (NWS-3100 シリーズの場合)
[EINVAL] • ioctl リクエスト、引数が有効でない。
• write された ADPCM データに誤りがありデコードができなかった。 (NWS-1200/1400/1500/1700
/1800/3200/3400/3700/3800 の場合)
[EINTR] システムコールが signal によって割り込まれた。
[EFAULT] read/write バッファが、割り当てられているアドレス範囲の外を指している。
[EIO] • read 時に FIFO がオーバーフローした。
• write 時に FIFO がオーバーフローした。(NWS-3100 の場合)
注意事項
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.2.1R