2013/02/10

C言語 wavファイルのヘッダをメモリに読込む

改めてWavファイルのヘッダを読み込むプログラムを作ってみる。ここにあるプログラムは完成したものではなく、予備実験のサンプル。関数の配置を試行錯誤しているところ。以前はファイルから直接一字一字読み込んでいたけど、今回は、まるっとメモリに読み込んでしまうことを考えてみた。この後の処理はそのうち書こうと思う。

プログラムの内容

コンパイルして出来たexeファイルにwavファイルをドラッグ&ドロップすると、ヘッダを1byteごと16進数で表示する。ただし現状では60byte固定。足りない場合は2倍にする仕組みを今後入れていく。またヘッダの解析を入れるとゴチャゴチャするので、今は入れていない。

プログラムの流れは、機能ごとに関数にわけて、main関数は各関数に指示を出すだけにした。これによって柔軟性のある開発が可能になる。共通で使う値などは構造体に管理する。main関数でインスタンスすることで、他の関数からも使えるようにしてみた。構造体に項目を追加して実用になるプログラムにするつもり。

wavヘッダ読込プログラム

/*
 * header_r.c
 * February 10th, 2013
 * Namagi
 * ヘッダを読むための予備実験 ヘッダをそのままメモリに格納
 */

#include <stdio.h>
#include <stdlib.h>

/* バッファ構造体 */
typedef struct {
  /* ファイルポインタ */
  FILE *fpr;
  /* ヘッダを丸々入れておく そのポインタ */
  unsigned char *buff_header; 
} BUFF;

/* ヘッダ情報構造体 */
typedef struct {
  /* ヘッドのサイズを入れる */
  int headsize;
  /* ファイルのパスを格納 */
  char *file_path;
} HEAD;

/* ヘッダリーダー 構造体に入れていく処理 */
void header(char **argv, BUFF *buff, HEAD *head) {
  int i;
  /* 初期値 足りなかったら倍にする そのうち実装 */
  head->headsize = 60;
  /* 構造体にファイル・パスをコピー */
  head->file_path = *argv;
  /* ファイル開く */
  buff->fpr = fopen(head->file_path, "rb");
  /* 動的メモリ確保 buff->buff_headerは先頭アドレスを示す*/
  buff->buff_header =
          (char*)malloc(sizeof(char) * head->headsize);
  /* エラー処理 */
  if (buff->buff_header == NULL) exit(1);
  /* 読み込み */
  fread(buff->buff_header,
           sizeof(char), head->headsize, buff->fpr);
  /* ファイルを閉じる */
  fclose(buff->fpr);
}

/* ヘッダビュー 16進数で表示する */
void header_view_hex(BUFF *buff, HEAD *head) {
  int i;
  printf("path: %s\n", head->file_path);
  for(i=0; i<head->headsize; i++){ 
     /* 改行 */
     if(i % 16 == 0) printf("\n");
     /* 16進数で表示 */
     printf("%02x ", *(buff->buff_header+i));
  }
  printf("\n");
}

/* メイン関数は操作のみ。具体的な処理は他関数で行う。*/
int main(int argc, char *argv[]) {
  /* 構造体のインスタンス化 */
  BUFF buff;
  /* 構造体のインスタンス化 */
  HEAD head;
  /* ヘッダ読込 構造体のアドレスとパスを渡す */
  header(&argv[1], &buff, &head);
  /* ヘッダ表示 */
  header_view_hex(&buff, &head);
  /* メモリ解放 */
  free(buff.buff_header);
  printf("\nSuccess!\nPress Enter key to exit.\n");
  /* これで一時停止 */
  getchar();
  return 0;
}

実行するとコマンドプロンプトに下のように表示される。ファイルのパスと、頭から60byte分のデータを16進数で表示。
path: C:\sample.wav
52 49 46 46 2e 00 00 00 57 41 56 45 66 6d 74 20 
10 00 00 00 01 00 01 00 44 ac 00 00 88 58 01 00 
02 00 10 00 64 61 74 61 0a 00 00 00 00 00 ff 7f 
00 00 00 80 00 00 67 72 61 6d 20 46
Success!
Press Enter key to exit.


C言語 ANSI C89 Meadow & MinGW GCC 目次はこちら