ホーム 主筆 その他ソフト その他情報 Syuhitu.org English

Windows関連

スクリーンセーバー作成法

半透明ウインドウの性能

bootfont.bin

キャビネット形式

ウインドウスタイルをいじる

Java製ソフトをServiceに登録する

イベントログにメッセージを出力する

コントロールパネルにアイコンを追加する

スクリプトによる拡張1

スクリプトによる拡張2

ガジェットの作成

大容量メモリ

メモリ搭載量の下限に挑む

スパースファイルにする

表示されるアイコンの種類を調べてみた

メモリマップIOとエラー処理

ファイルを作る順番と速度の関係

Cryptography API: Next Generationを使う

Windows 10のアクセントカラー

iSCSIディスクにバックアップを取る

サーバプロセスを分離して実装する

サーバプロセスを分離して実装する - F#

レジストリに大量に書き込む

Solaris関連

OpenGL

Solaris設定

ディレクトリの読み込み

主筆プラグイン開発

マルチスレッドでの開発

door

音を出す

Blade100の正しい虐め方

パッケージの作成

画像入出力

BMPファイル

ICOファイル

ANIファイル

JPEGファイル

減色アルゴリズム

減色アルゴリズムの並列化

その他アルゴリズムなど

自由軸回転

Base64

文字列操作

CPU利用率の取得

正規表現ライブラリ

メタボールを作る

メタボールを作る2

正規表現とNFA・DFA

C言語の構文解析

液晶ディスプレイを解体してみた

iSCSIの理論と実装

単一フォルダにファイルを沢山作る

USB-HUBのカスケード接続

SafeIntの性能

VHDファイルのフォーマット

USBメモリに書き込み続けてみた

au - Audio file format

2006年3月4日公開

必要なヘッダ

<audio/au.h>

概要

AUオーディオファイルフォーマットは三つのパートから構成されている。

  1. ヘッダ
  2. 追加情報(オプション)
  3. オーディオデータ

ヘッダは24バイトであり、追加情報は最小で4バイトである。よって、大概のAUファイルでは、オーディオデータは29バイト目から記録されていることになる。しかし、時にはヘッダが大きくなる場合がある。

AUオーディオ構造体とオーディオデータは、AUファイルを取り扱うマシンのバイトオーダーに関わらずビッグエンディアンで記録される。つまり、x86だろうがSPARCだろうが関係ないということ。

何分Solarisにはx86版とSPARC版があるから、移植性についてはちと考えなければならない。そういうことで、audio/au.hヘッダに、読み込んだデータのバイトオーダーを変更するマクロが定義してある。移植性を考えるだけの余裕があるなら、このマクロを使いましょう。

AUオーディオ構造体

 struct au_filehdr {
  uint32_t au_magic;       /* マジックナンバー(.snd) */
  uint32_t au_offset;      /* オーディオデータが記録されているバイトオフセット */
  uint32_t au_data_size;   /* データ長(バイト) */
  uint32_t au_encoding;    /* エンコードの種別 */
  uint32_t au_sample_rate; /* 一秒あたりのサンプル数 */
  uint32_t au_channels;    /* チャンネル数 */
};
typedef struct au_filehdr au_filehdr_t;

au_magicフィールドには、下記の定数が記録される。

#define AUDIO_AU_FILE_MAGIC ( 0x2e736e64 ) /* ".snd" */

au_offsetには、ヘッダ+追加情報のバイト数が記録される。

au_data_sizeには、記録されているデータのバイト数が格納される。しかし、ヘッダを記録した時点にはデータ長が判明していなかった、とかいう場合にはAUDIO_AU_UNKNOWN_SIZEが格納される。

#define AUDIO_AU_UNKNOWN_SIZE ( ~0 ) /* (unsigned) -1 */

AUDIO_AU_UNKNOWN_SIZEが記録されていた場合には、データ長は「ファイル長-ヘッダ長」で算出すること。

encodingには、下記の定数の内のいずれか一つが記録される。

定数 意味
AUDIO_AU_ENCODING_ULAW 8bit μ-law
AUDIO_AU_ENCODING_LINEAR_8 8bit liner PCM
AUDIO_AU_ENCODING_LINEAR_16 16bit liner PCM
AUDIO_AU_ENCODING_LINEAR_24 24bit liner PCM
AUDIO_AU_ENCODING_LINEAR_32 32bit liner PCM
AUDIO_AU_ENCODING_FLOAT 浮動小数点数 float
AUDIO_AU_ENCODING_DOUBLE 倍精度浮動小数点数 double
AUDIO_AU_ENCODING_FRAGMENTED フラグメント化されている
AUDIO_AU_ENCODING_DSP DSPのプログラム
AUDIO_AU_ENCODING_FIXED_8 8bit固定小数点
AUDIO_AU_ENCODING_FIXED_16 16bit固定小数点
AUDIO_AU_ENCODING_FIXED_24 24bit固定小数点
AUDIO_AU_ENCODING_FIXED_32 32bit固定小数点
AUDIO_AU_ENCODING_EMPHASIS 強勢付き16bit liner
AUDIO_AU_ENCODING_COMPRESSED 圧縮された16bit liner
AUDIO_AU_ENCODING_EMP_COMP 圧縮された強勢付き16bit liner
AUDIO_AU_ENCODING_MUSIC_KIT Music Kit DSP コマンド
AUDIO_AU_ENCODING_ADPCM_G721 CCITT G.721 ADPCM
AUDIO_AU_ENCODING_ADPCM_G722 CCITT G.722 ADPCM
AUDIO_AU_ENCODING_ADPCM_G723_3 CCITT G.723.3 ADPCM
AUDIO_AU_ENCODING_ADPCM_G723_5 CCITT G.723.5 ADPCM
AUDIO_AU_ENCODING_ALAW 8bit A-law G.711

PCMのデータは、全て符号付き整数であり、中心の値は0である。

au_sample_rateには、オーディオファイルのサンプリングレート(サンプル数毎秒)が記録される。一般的には、8000・11025・22050・44100・48000である。

au_channelsには、一つのサンプルフレーム内にインターリーブされているチャンネル数が記録される。モノラルのデータであれば、この値は1になる。ステレオならば2になる。もっと大きな値になる可能性もあるが、現状Solarisのオーディオデバイスでは、ステレオ以上の構成はサポートしていない。ステレオの場合、サンプルフレーム内の最初のデータが左のチャンネルで、次のデータが右のチャンネルである。

追加情報フィールドには、可変長のテキストかバイナリのデータが記録される。もし、記録されているのがサウンドのデータに関するテキストの注釈であった場合は、末尾はNULLで終わっている必要がある。ただし、古いファイルでは必ずしもNULLで終了しているとは限らない。

AUファイルを出力するとき、構造体の追加情報の長さを出力したら、それ以降は追加情報を長くしてはいけない。

マクロ

AUオーディオ構造体のメンバにアクセスする際は、AUDIO_AU_FILE2HOSTとAUDIO_AU_HOST2FILEのマクロを使用するべきである。このマクロを使用することにより、バイトオーダーから独立することができる。

AUオーディオファイルを読み込み、ヘッダの内容を表示する。

void main( void )
{
  au_filehdr_t hdr;
  au_filehdr_t lcl;
  int fd;
  const char *name = "bark.au";

  fd = open( name, O_RDONLY );
  if ( fd < 0) {
    printf( "can't open file %s\n", name );
    exit( 1 );
  }

  read( fd, &hdr, sizeof( hdr ) );

  AUDIO_AU_FILE2HOST( &hdr.au_magic, &lcl.au_magic );
  AUDIO_AU_FILE2HOST( &hdr.au_offset, &lcl.au_offset );
  AUDIO_AU_FILE2HOST( &hdr.au_data_size, &lcl.au_data_size );
  AUDIO_AU_FILE2HOST( &hdr.au_encoding, &lcl.au_encoding );
  AUDIO_AU_FILE2HOST( &hdr.au_sample_rate, &lcl.au_sample_rate );
  AUDIO_AU_FILE2HOST( &hdr.au_channels, &lcl.au_channels );

  printf( "Magic = %x\n", lcl.au_magic );
  printf( "Offset = %d\n", lcl.au_offset );
  printf( "Number of data bytes = %d\n", lcl.au_data_size );
  printf( "Sound format = %d\n", lcl.au_encoding );
  printf( "Sample rate = %d\n", lcl.au_sample_rate );
  printf( "Number of channels = %d\n", lcl.au_channels );

  close( fd );
}

 

※注 このページの情報に間違いがあっても、俺は知らんぜ。

<< 「Solarisで音を出す」に戻る


連絡先 - サイトマップ - 更新履歴
Copyright (C)  2000 - 2016 nabiki_t All Rights Reserved.