Core Audioによるサウンドカード出力のキャプチャ

10092 ワード

関連するインタフェースは次のとおりです.
  • IMMDeviceEnumerator
  • IMMDevice
  • IAudioClient
  • IAudioCaptureClient

  • 主なプロセス:
  • マルチメディアデバイス列挙器(IMMDeviceEnumerator)
  • を作成する
  • マルチメディアデバイス列挙器により音声カードインターフェース(IMMDevice)
  • を取得する.
  • サウンドカードインタフェースにより取得するサウンドカードクライアントインタフェース
  • .
  • サウンドカードクライアントインターフェース(IAudioClient)を介してサウンドカード出力のオーディオパラメータを取得する、サウンドカードを初期化する、サウンドカード出力バッファのサイズを取得する、サウンドカード出力の収集をオン/停止する
  • .
  • サウンドカード採取クライアントインターフェース(IAudioCaptureClient)により採取サウンドカード出力データを取得し、内部バッファを制御
  • .
  • サウンドカード出力クライアントインターフェース(IAudionderClient)により収集した音声データを音声出力装置のキャッシュ部に書き込むことができ、出力装置はIAudioClient::GetService関数によりIAudionderClientインターフェースを取得することができる.

  •      
    コードの例:
       
    //まずオーディオデバイスを列挙します.このとき、あなたのマシンで使用可能なすべてのデバイスを取得し、使用するデバイスを指定することができます.
    hr = CoCreateInstance(
                        CLSID_MMDeviceEnumerator, NULL,
                        CLSCTX_ALL, IID_IMMDeviceEnumerator,
                        (void**)&pEnumerator);

    EXIT_ON_ERROR(hr)

       

    hr = pEnumerator->GetDefaultAudioEndpoint(

                        eCapture, eConsole, &pDevice);

    EXIT_ON_ERROR(hr)

       

       

    //        ,                
    hr = pDevice->Activate(
    
                        IID_IAudioClient, CLSCTX_ALL,
    
                        NULL, (void**)&pAudioClient);
    
    EXIT_ON_ERROR(hr)
    

       
    hr = pAudioClient->GetMixFormat(&pwfx);
    
    EXIT_ON_ERROR(hr)
    

       
    //       ,   ,              ,     ,                          ,            
    
    hr = pAudioClient->Initialize(
    
                             AUDCLNT_SHAREMODE_SHARED,
    
                             0,
    
                             hnsRequestedDuration,
    
                             0,
    
                             pwfx,
    
                             NULL);
    
    EXIT_ON_ERROR(hr)

       
    //  buffersize,                   
    
    hr = pAudioClient->GetBufferSize(&bufferFrameCount);
    
    EXIT_ON_ERROR(hr)

     
    //        ,       ,        
    hr = pAudioClient->GetService(
    
                             IID_IAudioCaptureClient,
    
                             (void**)&pCaptureClient);
    
    EXIT_ON_ERROR(hr)
    

     
    // Notify the audio sink which format to use.
    hr = pMySink->SetFormat(pwfx);
    
    EXIT_ON_ERROR(hr)
    

       
    // Calculate the actual duration of the allocated buffer.
    hnsActualDuration = (double)REFTIMES_PER_SEC *
    
                         bufferFrameCount / pwfx->nSamplesPerSec;
    

       
    hr = pAudioClient->Start();  // Start recording.
    
    EXIT_ON_ERROR(hr)
    

       
       
    // Each loop fills about half of the shared buffer.
    while (bDone == FALSE)
    
    {
    
        //           ,                                       
    
            Sleep(hnsActualDuration/REFTIMES_PER_MILLISEC/2);
    

       
            hr = pCaptureClient->GetNextPacketSize(&packetLength);
    
            EXIT_ON_ERROR(hr)
    

       
        while (packetLength != 0)
    
            {
            //     ,    
            hr = pCaptureClient->GetBuffer(
    
                                       &pData,
    
                                       &numFramesAvailable,
    
                                       &flags, NULL, NULL);
    
                    EXIT_ON_ERROR(hr)

       
          if (flags & AUDCLNT_BUFFERFLAGS_SILENT)
    
               {
    
                    pData = NULL;  
    
               }
    

         
                hr = pMySink->CopyData(
    
                                  pData, numFramesAvailable, &bDone);
    
                EXIT_ON_ERROR(hr)
    

         
                hr = pCaptureClient->ReleaseBuffer(numFramesAvailable);
    
                EXIT_ON_ERROR(hr)
    

         
                hr = pCaptureClient->GetNextPacketSize(&packetLength);
    
                EXIT_ON_ERROR(hr)
    
            }
    
        }
    

       
    hr = pAudioClient->Stop(); 
    
    EXIT_ON_ERROR(hr)


    audacity

    転載先:https://www.cnblogs.com/poissonnotes/p/7479570.html