1st step to understand DirectShow その11(GrabberSample Exampleも玉砕)


Buffer sizeは、全く変わってない...... 涙 (-_-)

 1.DirectShowを、使い切れない....

    以前、MFC(Microsoft Foundation Class)を、使えなかったのと、同じです。

    この帝国(DirectShow)を、自由に動き回れないのは、私の知識不足の為です、クソッ。

    この機会に、DirectShowを覚えたいと思ったのですが、そんなもん、生半可では、歯が立たない.....

    WAVファイルの書き込みだけは、DirectShowを使います。

    1st stepは、これにて終了。

 2.ほな、次の手を打ちましょう....

    単純に、Win32プログラミングで、行きましょうね、クソッ。

    WAVファイルを、読み書きするプログラムは、webの随所で、見ることができます。

    大いに参考にさせて頂きました。公開して下さった皆様に、御礼申し上げます。

 3.これなら、Buffer sizeも自由自在


 
    後は、どのタイミングで、bufferに書き込むかの、問題です。

    以下は、今回のプログラムです。

// wave_read.cpp : コンソール アプリケーションのエントリ ポイントを定義します。
//

#include "stdafx.h"
#include "windows.h"
#include"mmreg.h"

struct WAVE_HDR{
 DWORD chunk_ID;
 DWORD file_size;
 DWORD file_type;
 DWORD fmt_ID;
 DWORD fmt_size;
 WAVEFORMATEX wfm;
 DWORD data_ID;
 DWORD data_size;
};

void read_wave_format_chunk(FILE *fp,WAVE_HDR* whd)
{
  fread(&whd->chunk_ID,sizeof(DWORD),1,fp);
  if(whd->chunk_ID !=0x46464952) //RIFF
  {
   printf("not RIFF file! ?n");
   return;
  }
  fread(&whd->file_size,sizeof(DWORD),1,fp);
  fread(&whd->file_type,sizeof(DWORD),1,fp);
  if(whd->file_type !=0x45564157) //WAVE
  {
   printf("not WAVE file?n");
   return;
  }
  fread(&whd->fmt_ID,sizeof(DWORD),1,fp);
  if(whd->fmt_ID !=0x20746d66) //fmt
  {
   printf("not fmtID?n");
   return;
  }
  fread(&whd->fmt_size,sizeof(DWORD),1,fp);
  if(whd->fmt_size ==18)
  {
   fread(&whd->wfm.wFormatTag,sizeof(WORD),1,fp);
   fread(&whd->wfm.nChannels,sizeof(WORD),1,fp);
   fread(&whd->wfm.nSamplesPerSec,sizeof(DWORD),1,fp);
   fread(&whd->wfm.nAvgBytesPerSec,sizeof(DWORD),1,fp);
   fread(&whd->wfm.nBlockAlign,sizeof(WORD),1,fp);
   fread(&whd->wfm.wBitsPerSample,sizeof(WORD),1,fp);
   fread(&whd->wfm.cbSize,sizeof(WORD),1,fp);
  }
  if(whd->fmt_size ==16) //for wave files recorded using PowerSDR
  {
   fread(&whd->wfm.wFormatTag,sizeof(WORD),1,fp);
   fread(&whd->wfm.nChannels,sizeof(WORD),1,fp);
   fread(&whd->wfm.nSamplesPerSec,sizeof(DWORD),1,fp);
   fread(&whd->wfm.nAvgBytesPerSec,sizeof(DWORD),1,fp);
   fread(&whd->wfm.nBlockAlign,sizeof(WORD),1,fp);
   fread(&whd->wfm.wBitsPerSample,sizeof(WORD),1,fp);
  }

  if(whd->wfm.wFormatTag !=3) //IEEE_FLOAT
  {
   printf("not IEEE_FLOAT32 Format?n");
   return;
  }

  fread(&whd->data_ID,sizeof(DWORD),1,fp);

  if(whd->data_ID !=0x61746164)//"data"
  {
   printf("data error");
   return;
  }
 //data size
  fread(&whd->data_size,sizeof(DWORD),1,fp);

 float l_channel[2048];
 float r_channel[2048];
 WORD loop_number=whd->data_size/4096/4;            //何回ループするか?
 WORD rest_data_number=(whd->data_size%(4096*4))/4; //残りデータ数

 int i=0;
 int j=0;
  for(i;i<4096;i++)
  {

   if(i%2)
   {
    fread(r_channel+j,sizeof(float),1,fp);
    j++; 
   }
   else
   {
    fread(l_channel+j,sizeof(float),1,fp);
   }
  }
 }

int _tmain(int argc, _TCHAR* argv[])
{
  FILE *fp;
  WAVE_HDR whd;
  whd.wfm.cbSize=0;
  wchar_t* filename=L"mywave3.wav";
  errno_t err;

  if( (err=_wfopen_s(&fp, filename,L"rb")) !=0)
  {
   printf("fail to open file ?n");
   if(fp)
    fclose(fp);
   return 1;
  }

  read_wave_format_chunk(fp,&whd);

  if(fp)
   fclose(fp);

  return 0;
}

    H.20.5.9