我的独家模式wasapi代码有什么问题? [英] what's wrong with my exclusive mode wasapi code...?

查看:248
本文介绍了我的独家模式wasapi代码有什么问题?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我在HP Pavilion Vista Business 32位上有一张RealTek卡。

I've got some kinda RealTek card on an HP Pavilion Vista Business 32 bit.

另一台电脑:惠普Pavilion Windows7 64位。 相同的"内置于主板声卡"我想。

Another pc: HP Pavilion Windows7 64 bit.  Same "built into mobo soundcard" i think.

在Vista上,我已经更新到最新的声卡驱动程序。

On Vista, I've updated to latest soundcard driver.

以下是我使用的代码我改编自msdn独占流示例。

Below is the code I'm using that I adapted from msdn exclusive stream example.

到目前为止,我只测试了Open()和Shut()音频功能。

So far I'm only testing out the Open() and Shut() audio funcs.

我终于得到了waveformatex params。

I finally got my waveformatex params right.

(愚蠢的声卡的OEM表示它会做32位48KHz,但是IsFormat ......只说

(Stupid soundcard's OEM says it'll do 32 bit 48KHz, but IsFormat... only says

  CD音频规格好的。)

 CD audio specs are ok.)

所以,如果有人可以帮助我...?

So if anybody could help me out here...?

提前致谢:)

... Steve

...Steve

 

// syn.cpp - 用于pianocheater的soundfont patch playin synth

// syn.cpp - soundfont patch playin synth for pianocheater

的#include" os.h"

#include "os.h"

的#include" initguid.h"

的#include" mmdeviceapi.h" <无线电通信/>
#include" audioclient.h"

#include" avrt.h"

#include "initguid.h"
#include "mmdeviceapi.h"
#include "audioclient.h"
#include "avrt.h"

const ulong RT_MSEC     ;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP; = 10000;    // reftime per millisec

const CLSID CLSID_MMDeviceEnumerator = __uuidof(MMDeviceEnumerator);

const IID   IID_IMMDeviceEnumerator&NBSP; = __uuidof(IMMDeviceEnumerator);
$
const IID   IID_IAudioClient&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP; = __uuidof(IAudioClient);
$
const IID   IID_IAudioRenderClient&NBSP;&NBSP; = __uuidof(IAudioRenderClient);

const ulong RT_MSEC                  = 10000;    // reftime per millisec
const CLSID CLSID_MMDeviceEnumerator = __uuidof(MMDeviceEnumerator);
const IID   IID_IMMDeviceEnumerator  = __uuidof(IMMDeviceEnumerator);
const IID   IID_IAudioClient         = __uuidof(IAudioClient);
const IID   IID_IAudioRenderClient   = __uuidof(IAudioRenderClient);

类AudO {

public:

   AudO()  {}

class AudO {
public:
   AudO ()  {}



   void Wipe()

   {&NBSP; _dev = NULL;  _aud = NULL;  _rnd = NULL;

      _ev = _tsk = NULL;   _dur = 0;

   }


   void Wipe ()
   {  _dev = NULL;  _aud = NULL;  _rnd = NULL;
      _ev = _tsk = NULL;   _dur = 0;
   }



   void Open()

   {HRESULT hr;

     DWORD&NBSP;&NBSP; tskInd = 0;

     WAVEFORMATEX fmt;

     擦除();


   void Open ()
   { HRESULT hr;
     DWORD   tskInd = 0;
     WAVEFORMATEX fmt;
      Wipe ();

   //从devEnum获取dev(默认波形设备):/
$
      {IMMDeviceEnumerator * devEnum = NULL;

         HR = :: CoCreateInstance的(CLSID_MMDeviceEnumerator,NULL,CLSCTX_ALL,

&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP; &NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP; IID_IMMDeviceEnumerator,(无效**)及devEnum); <无线电通信/>
         if(FAILED(hr))  DieHR("无法获取音频输出设备列表",小时);
$
         HR = devEnum-> GetDefaultAudioEndpoint(eRender,eConsole,&安培; _dev);

&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP; if(FAILED(hr))  DieHR("无法获取默认音频输出设备",hr);

         devEnum-> Release();

      }

   // get dev (default wave out device) from devEnum :/
      { IMMDeviceEnumerator *devEnum = NULL;
         hr = ::CoCreateInstance (CLSID_MMDeviceEnumerator, NULL, CLSCTX_ALL,
                                  IID_IMMDeviceEnumerator, (void**)& devEnum);
         if (FAILED(hr))  DieHR ("can't get audio out device lister",  hr);
         hr = devEnum->GetDefaultAudioEndpoint (eRender, eConsole, & _dev);
         if (FAILED(hr))  DieHR ("can't get default audio out device", hr);
         devEnum->Release ();
      }

   //获取开发者首选的WAVEFORMATEX

      {IPropertyStore * prp;

         hr = _dev-> OpenPropertyStore(STGM_READ,& prp);

         if(FAILED(hr))  DieHR("无法获取音频属性",小时);

        PROPVARIANT var;

         :: PropVariantInit(& var);    // PKEY_AudioEngine_DeviceFormat ??

         hr = prp-> GetValue(PKEY_AudioEngine_OEMFormat,& var);

         if(FAILED(hr))  DieHR("无法获取音频设备格式",hr);

         MemCp(& fmt,var.blob.pBlobData,sizeof(fmt));  // GOTCHA - whew!
$
DBGF(" oem fmt:chans =%d bits =%d frq =%d bytes / block =%d bytes / sec =%d",
fmt.nChannels,fmt.wBitsPerSample,fmt.nSamplesPerSec,

fmt.nBlockAlign,fmt.nAvgBytesPerSec);

     &NBSP;&NBSP;&NBSP;&NBSP; :: PropVariantClear(& var);

         prp-> Release();

      }

   // get dev's preferred WAVEFORMATEX
      { IPropertyStore *prp;
         hr = _dev->OpenPropertyStore (STGM_READ, & prp);
         if (FAILED(hr))  DieHR ("can't get audio properties", hr);
        PROPVARIANT var;
         ::PropVariantInit (& var);    // PKEY_AudioEngine_DeviceFormat ??
         hr = prp->GetValue (PKEY_AudioEngine_OEMFormat, & var);
         if (FAILED(hr))  DieHR ("can't get audio device format", hr);
         MemCp (& fmt, var.blob.pBlobData, sizeof (fmt));  // GOTCHA - whew !
DBGF("oem fmt: chans=%d bits=%d frq=%d bytes/block=%d bytes/sec=%d",
fmt.nChannels, fmt.wBitsPerSample, fmt.nSamplesPerSec,
fmt.nBlockAlign, fmt.nAvgBytesPerSec);
         ::PropVariantClear (& var);
         prp->Release ();
      }

   //获得审计

      hr = _dev->激活(IID_IAudioClient,CLSCTX_ALL,NULL,(void **)& _aud);

      if(FAILED(hr))  DieHR("无法激活音频输出",小时);

   // get aud
      hr = _dev->Activate (IID_IAudioClient, CLSCTX_ALL, NULL, (void**)& _aud);
      if (FAILED(hr))  DieHR ("couldn't activate audio out", hr);

   //继续抱怨IsFormatSupported直到我们得到一些东西或者要退出为止b $ b      fmt.nChannels = 2;               //只需立体音响我
     做{

         fmt.nBlockAlign = fmt.wBitsPerSample / 8 * fmt.nChannels;

         fmt.nAvgBytesPerSec = fmt.nBlockAlign * fmt.nSamplesPerSec;

DBGF(QUOT;尝试FMT:CHANS =%d位=%d FRQ =%d字节/块=%d字节/秒=% d",

fmt.nChannels,fmt.wBitsPerSample,fmt.nSamplesPerSec,

fmt.nBlockAlign,fmt.nAvgBytesPerSec);

   // keep whining to IsFormatSupported till we get somethin or gotta quit
      fmt.nChannels = 2;               // just stereo fer me
      do {
         fmt.nBlockAlign = fmt.wBitsPerSample / 8 * fmt.nChannels;
         fmt.nAvgBytesPerSec = fmt.nBlockAlign * fmt.nSamplesPerSec;
DBGF("try fmt: chans=%d bits=%d frq=%d bytes/block=%d bytes/sec=%d",
fmt.nChannels, fmt.wBitsPerSample, fmt.nSamplesPerSec,
fmt.nBlockAlign, fmt.nAvgBytesPerSec);

&NBSP;&NBSP;&NBSP;&NBSP;&NBSP; //检查fmt是否正确?
         hr = _aud-> IsFormatSupported(AUDCLNT_SHAREMODE_EXCLUSIVE,& fmt,NULL);

         if(FAILED(hr)){

DBG(" ... nope:(");)
          //老鼠,尝试更容易一些,如果我们已经做了16位,44.1 frq以及
             if     (fmt.wBitsPerSample> 32)    fmt.wBitsPerSample = 32;

      &NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;否则,如果(fmt.nSamplesPerSec> 96000)fmt.nSamplesPerSec = 96000;

&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;      else if(fmt.wBitsPerSample> 24)    fmt.wBitsPerSample = 24;

             else if(fmt.nSamplesPerSec> 48000)fmt.nSamplesPerSec = 48000;

             else if(fmt.wBitsPerSample> 16)    fmt.wBitsPerSample = 16;

   &n BSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;否则if(fmt.nSamplesPerSec> 44100)fmt.nSamplesPerSec = 44100;

           否则&NBSP;&NBSP;&NBSP;&NBSP;死("dang dang声卡不会做16位44.1K音频:(");

        }

         else

DBG(" ... FORMAT OK !!");


     } while(FAILED(hr));

      // check fmt is ok
         hr = _aud->IsFormatSupported (AUDCLNT_SHAREMODE_EXCLUSIVE, &fmt, NULL);
         if (FAILED(hr)) {
DBG("...nope:(");
         // rats, try somethin easier, quit if we already did 16 bit,44.1 frq
            if      (fmt.wBitsPerSample > 32)    fmt.wBitsPerSample = 32;
            else if (fmt.nSamplesPerSec > 96000) fmt.nSamplesPerSec = 96000;
            else if (fmt.wBitsPerSample > 24)    fmt.wBitsPerSample = 24;
            else if (fmt.nSamplesPerSec > 48000) fmt.nSamplesPerSec = 48000;
            else if (fmt.wBitsPerSample > 16)    fmt.wBitsPerSample = 16;
            else if (fmt.nSamplesPerSec > 44100) fmt.nSamplesPerSec = 44100;
            else     Die ("yer dang sound card won't do 16 bit 44.1K audio :(");
         }
         else
DBG("...FORMAT OK !!");
      } while (FAILED(hr));

   //获得最小延迟;  init aud。

      hr = _aud-> GetDevicePeriod(NULL,& _dur);

     如果(FAILED(小时))&NBSP; Diehr案(QUOT;不能得到音频输出的延时值" ;,小时);

   // get minimum latency;  init aud.
      hr = _aud->GetDevicePeriod (NULL, & _dur);
      if (FAILED(hr))  DieHR ("couldn't get audio out's latency value", hr);

&NBSP;&NBSP;&NBSP;&NBSP;&NBSP; HR = _aud - >初始化(AUDCLNT_SHAREMODE_EXCLUSIVE,

&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP ;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP; AUDCLNT_STREAMFLAGS_EVENTCALLBACK,

&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP ;&NBSP;&NBSP;&NBSP;&NBSP;&NB属;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP; _dur,_dur,& fmt,NULL);
$
      if(!FAILED(hr)){

      //创建事件句柄n将其注册为缓冲事件通知。

         _ev = CreateEvent(NULL,FALSE,FALSE,NULL);

         if(_ev == NULL) 死亡("无法为音频处理程序制作活动");

         hr = _aud-> SetEventHandle(_ ev);

         if(FAILED(hr))

            DieHR("无法注册音频处理程序事件",hr);

      }
     否则{
$
      //叹气,reget _aud; 看看驾驶员是否至少可以做计时器...

DBG("老鼠,回到计时器而不是基于事件");

   &NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP; _aud-> Release();

         hr = _dev->激活(IID_IAudioClient,CLSCTX_ALL,NULL,

               &NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;(无效**)及_aud);

&NBSP; &NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP; if(FAILED(hr))  DieHR("无法激活音频输出",小时);

      hr = _aud->Initialize (AUDCLNT_SHAREMODE_EXCLUSIVE,
                             AUDCLNT_STREAMFLAGS_EVENTCALLBACK,
                             _dur, _dur, & fmt, NULL);
      if (! FAILED(hr)) {
      // Create event handle n register it for buffer-event notifications.
         _ev = CreateEvent (NULL, FALSE, FALSE, NULL);
         if (_ev == NULL)  Die ("couldn't make an event for audio handler");
         hr = _aud->SetEventHandle (_ev);
         if (FAILED(hr))
            DieHR ("couldn't register event for audio handler", hr);
      }
      else {
      // sigh, reget _aud;  see if driver can do timer based at least...
DBG("rats, falling back to timer based instead of event based");
         _aud->Release ();
         hr = _dev->Activate (IID_IAudioClient, CLSCTX_ALL, NULL,
                              (void**)& _aud);
         if (FAILED(hr))  DieHR ("couldn't activate audio out", hr);

         hr = _aud->初始化(AUDCLNT_SHAREMODE_EXCLUSIVE,  0,

                                 _dur,_dur,& fmt,NULL);

         if(FAILED(hr))  Diehr案("无法初始化音频输出:(\r\\\
"

&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP ;                    "请尝试更新声卡的驱动程序"

                                 " from manufacturer's website",hr);

      }

         hr = _aud->Initialize (AUDCLNT_SHAREMODE_EXCLUSIVE,  0,
                                _dur, _dur, & fmt, NULL);
         if (FAILED(hr))  DieHR ("couldn't initialize audio out :(\r\n"
                                 "please try updating soundcard's driver "
                                 "from manufacturer's website", hr);
      }

   //获取两个已分配缓冲区的实际大小。 并获取rnd接口

      hr = _aud-> GetBufferSize(& _len);

      if(FAILED(hr))  DieHR("无法获取音频缓冲区"长度",小时";

      hr = _aud-> GetService(IID_IAudio) RenderClient,(void **)& _rnd);
$
      if(FAILED(hr))  DieHR("无法获得音频的渲染界面",hr);

   // Get actual size of two allocated buffers.  and get rnd interface
      hr = _aud->GetBufferSize (& _len);
      if (FAILED(hr))  DieHR ("couldn't get audio buffer length", hr);
      hr = _aud->GetService (IID_IAudioRenderClient, (void**)& _rnd);
      if (FAILED(hr))  DieHR ("couldn't get render interface for audio", hr);

   //要求MMCSS暂时提升线程prio以减少故障

      _tsk = AvSetMmThreadCharacteristics(TEXT(" Pro Audio"),& tskInd);

      if(_tsk == NULL) 死亡("无法提升音频任务prio");

   // Ask MMCSS to temporarily boost thread prio to reduce glitches
      _tsk = AvSetMmThreadCharacteristics (TEXT("Pro Audio"), & tskInd);
      if (_tsk == NULL)  Die ("couldn't raise audio task prio");

      hr = _aud-> Start();

      if(FAILED(hr))  DieHR("无法启动音频",小时);

   }

      hr = _aud->Start ();
      if (FAILED(hr))  DieHR ("couldn't start audio", hr);
   }



   void Put()

   {HRESULT hr;

     DWORD&NBSP;&NBSP; rc;

     DWORD&NBSP;&NBSP; bFlg;

   //预加载缓冲区以减少延迟

      hr = _rnd-> GetBuffer     (_len,& _dat);
$
      if(FAILED(hr))  DieHR("无法获得音频的渲染缓冲区",hr);


   void Put ()
   { HRESULT hr;
     DWORD   rc;
     DWORD   bFlg;
   // preload buffer to reduce latency
      hr = _rnd->GetBuffer     (_len, & _dat);
      if (FAILED(hr))  DieHR ("couldn't get render buffer for audio", hr);

   //设置dat和bFlg

// TODO

      hr = _rnd-> ReleaseBuffer(_len,  bFlg);

      if(FAILED(hr))  DieHR("无法为音频设置渲染缓冲区",hr);

   // set dat and bFlg
//TODO
      hr = _rnd->ReleaseBuffer (_len,  bFlg);
      if (FAILED(hr))  DieHR ("couldn't set render buffer for audio", hr);

   //每个循环填充两个缓冲区中的一个。

      while(bFlg!= AUDCLNT_BUFFERFLAGS_SILENT){

      //等待下一个缓冲区事件发出信号。

         rc = :: WaitForSingleObject(_ev,2000);

         if(rc!= WAIT_OBJECT_0)         //等待2秒后超时:(左
           {_aud-> Stop();   死亡("音频输出设备超时:(");}

   // Each loop fills one of the two buffers.
      while (bFlg != AUDCLNT_BUFFERFLAGS_SILENT) {
      // Wait for next buffer event to be signaled.
         rc = ::WaitForSingleObject (_ev, 2000);
         if (rc != WAIT_OBJECT_0)         // timed out after a 2 sec wait :(
            {_aud->Stop ();   Die ("audio out device timed out :(");}

      //将下一个buf放入dev

         hr = _rnd-> GetBuffer    (_ alen,& _dat);

&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;如果(FAILED(小时))&NBSP; Diehr案(QUOT;不能得到渲染音频" ;,小时缓冲液);

      // put next buf to dev
         hr = _rnd->GetBuffer     (_len, & _dat);
         if (FAILED(hr))  DieHR ("couldn't get render buffer for audio", hr);

      // set dat and bFlg

// TODO

          hr = _rnd-> ReleaseBuffer(_len,  bFlg);

         if(FAILED(hr) ))  DieHR("无法设置音频渲染缓冲区",hr);

     }

   }

      // set dat and bFlg
//TODO
         hr = _rnd->ReleaseBuffer (_len,  bFlg);
         if (FAILED(hr))  DieHR ("couldn't set render buffer for audio", hr);
      }
   }



   void关闭()

 &nbs p; //在停止前等待最后一个缓冲区播放;  n清理干净...

   {HRESULT hr;

      if(_rnd)  ::睡眠((DWORD)(_ dur / RT_MSEC));

      hr = _aud->停止();

      if(FAILED(hr))  DieHR("音频输出设备不会停止??",小时);

      if(_tsk)  AvRevertMmThreadCharacteristics(_tsk);

      if(_ev)   :: CloseHandle(_ev);

      _rnd-> Release();

      _aud-> Release();

      _dev->释放();

     擦除();

   }


   void Shut ()
   // Wait for the last buffer to play before stopping;  n clean it all up...
   { HRESULT hr;
      if (_rnd)  ::Sleep ((DWORD)(_dur / RT_MSEC));
      hr = _aud->Stop ();
      if (FAILED(hr))  DieHR ("audio out device won't stop??", hr);
      if (_tsk)  AvRevertMmThreadCharacteristics (_tsk);
      if (_ev)   ::CloseHandle (_ev);
      _rnd->Release ();
      _aud->Release ();
      _dev->Release ();
      Wipe ();
   }



private:

   IMMDevice&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP; * _dev;

   IAudioClient&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP; * _aud;

   IAudioRenderClient * _rnd;

   HANDLE&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP; _ev,_tsk;

   REFERENCE_TIME&NBSP;&NBSP;&NBSP;&NBSP;&NBSP; _dur;

   UINT32&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP; _len;

   BYTE&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP; * _dat;

};


private:
   IMMDevice          *_dev;
   IAudioClient       *_aud;
   IAudioRenderClient *_rnd;
   HANDLE              _ev, _tsk;
   REFERENCE_TIME      _dur;
   UINT32              _len;
   BYTE               *_dat;
};



// ---------------- -------------------------------------------------- ------------
$
int Go()

{

TRC(" {Go syn.exe" ;);

  DWORD * me;

  SHMEM&NBSP; sm;

// 味精&NBSP;&NBSP;&NBSP;消息;

  AUDO&NBSP;&NBSP; auo;

   :: CoInitialize(NULL);
$
TRC("sm init");

   if(!(me =(DWORD *)sm.Init(" syn.exe",4))) 死("sm.Init death");

   * me = :: GetCurrentThreadId();


//------------------------------------------------------------------------------
int Go ()
{
TRC("{ Go syn.exe");
  DWORD *me;
  ShMem  sm;
//  MSG    msg;
  AudO   auo;
   ::CoInitialize (NULL);
TRC("sm init");
   if (! (me = (DWORD *) sm.Init ("syn.exe", 4)))  Die ("sm.Init died");
   *me = ::GetCurrentThreadId ();

   auo.Open();

   auo.Shut();

   auo.Open ();
   auo.Shut ();

/ * TRC(" loopin");

**    while(:: GetMessage(& msg,(HWND)NULL,0,0)== TRUE){

**       if(msg.message == MSG_CLOSE){TRC(" MSG_CLOSE");  断开;}
**

** DBGF(" msg =%08X w =%08X l =%08X",msg.message,msg.wParam,msg .lParam);

**    }
* /

/* TRC("loopin");
**    while (::GetMessage (& msg, (HWND) NULL, 0, 0) == TRUE) {
**       if (msg.message == MSG_CLOSE) {TRC("MSG_CLOSE");   break;}
**
** DBGF("msg=%08X w=%08X l=%08X", msg.message, msg.wParam, msg.lParam);
**    }
*/

TRC("sm shut");

   sm.Shut();   :: CoUninitialize();

TRC("} Go");

  返回0;

}

TRC("sm shut");
   sm.Shut ();   ::CoUninitialize ();
TRC("} Go");
   return 0;
}



//由于实际需要愚蠢的crt启动:(

int WINAPI WinMain(HINSTANCE inst,HINSTANCE pInst,LPSTR cmdLn,int nShowCmd)

{  return AppBoot(); }


// need the stupid crt startup due to reals :(
int WINAPI WinMain (HINSTANCE inst, HINSTANCE pInst, LPSTR cmdLn, int nShowCmd)
{  return AppBoot ();  }

 

推荐答案

RATS,忘了提及它死于_aud-> Initialize()

RATS, forgot to mention, that it dies at _aud->Initialize()

我在其他一些帖子中看到,如果驱动程序不进行事件驱动,则需要使用基于定时器的缓冲区写入。

I saw on some other thread, that timer based buffer writing needs to be used if driver won't do event driven.

所以我_aud-> Release()并获得另一个尝试使用0而不是事件标志初始化()。

So I _aud->Release() and get another and try Initialize() with 0 instead of the event flag.

 

STILL不起作用。

STILL doesn't work.

 

我还应该解释一下,我通常有自己的启动代码,但不适用于这个应用程序,因为它使用浮动(而dang wasapi COM的东西让我需要crt启动也是。 

I should also explain that I usually have my own startup code, but not for this app cuz it uses floats (and the dang wasapi COM stuff makes me need crt startup too). 

所以crtstartup => WinMain => AppBoot => Go - 执行AudO类的Open()和Shut()。

So crtstartup=>WinMain=>AppBoot=>Go - which does Open() and Shut() of AudO class.

 

好的,sooooooo omebody he'p me pleeeeeeeeease !!

Ok, soooooooomebody he'p me, pleeeeeeeeease !!

 

... Steve

...Steve


这篇关于我的独家模式wasapi代码有什么问题?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆