Sampledaten Buffern



  • Hallo!
    Also ich hab folgendes problem, ich muss die sampledaten die übers mikro reinkommen buffern. Ich lese die sampledaten mit DirectSound ein:

    HRESULT CreateCaptureBuffer(LPDIRECTSOUNDCAPTURE8 pDSC,  
                                LPDIRECTSOUNDCAPTUREBUFFER8* ppDSCB8) 
    { 
     HRESULT hr; 
    DSCBUFFERDESC dscbd;
    LPDIRECTSOUNDCAPTUREBUFFER  pDSCB;
    WAVEFORMATEX wfx = {WAVE_FORMAT_PCM, 1, 44100, 176400/2, 2, 16, 0}; 
    
    // wFormatTag, nChannels, nSamplesPerSec, mAvgBytesPerSec, 
    // nBlockAlign, wBitsPerSample, cbSize 
    
    if ((NULL == pDSC) || (NULL == ppDSCB8))
    {
    return E_INVALIDARG;
    }
    dscbd.dwSize = sizeof(DSCBUFFERDESC); 
    dscbd.dwFlags = 0; 
    dscbd.dwBufferBytes =Buffersize; //wfx.nAvgBytesPerSec * 10; 
    dscbd.dwReserved = 0; 
    dscbd.lpwfxFormat = &wfx; 
    dscbd.dwFXCount = 0; 
    dscbd.lpDSCFXDesc = NULL; 
    
    if (SUCCEEDED(hr = pDSC->CreateCaptureBuffer(&dscbd, &pDSCB, NULL))) 
    { 
    hr = pDSCB->QueryInterface(IID_IDirectSoundCaptureBuffer8, 
    (LPVOID*)ppDSCB8);
    if(IsCapturing(lpCaptureBuffer)==FALSE)
    {
    } 
    pDSCB->Release(); 
    } 
    MessageBox(NULL,"Ende",NULL,MB_OK);
    return hr; 
     }
    
    bool IsCapturing(LPDIRECTSOUNDCAPTUREBUFFER8 lpCB) 
    { 
            DWORD dwStatus = 0; 
            lpCB->GetStatus(&dwStatus); 
            if( ((dwStatus & DSCBSTATUS_CAPTURING) == DSCBSTATUS_CAPTURING)  || 
                ((dwStatus & DSCBSTATUS_LOOPING) == DSCBSTATUS_LOOPING)     ) 
                  return true; 
            return false; 
    } 
    
    void InitDirectSound(void) 
    { 
            DirectSoundCaptureCreate8(NULL, &lpCaptureDevice, NULL); 
            CreateCaptureBuffer(lpCaptureDevice, &lpCaptureBuffer); 
    } 
    
    DWORD GetCaptureBufferSize(LPDIRECTSOUNDCAPTUREBUFFER8 lpCB) 
    { 
            DSCBCAPS Caps; 
            Caps.dwSize = sizeof(Caps); 
           lpCB->GetCaps(&Caps); 
    
           return Caps.dwBufferBytes; 
    } 
    
    void ShutdownDirectSound(void) 
    { 
          if(lpCaptureBuffer!=NULL) 
                lpCaptureBuffer->Release(); 
          if(lpCaptureDevice!=NULL) 
                lpCaptureDevice->Release(); 
    }
    

    Also ich hab mir schonmal überlegt die ganze zeit in nem thread abzufragen ob IsCapturing==FALSE is. mein Thread sieht so aus:

    void Thread(PVOID pvoid)
    {
    if(IsCapturing(lpCaptureBuffer)==FALSE)
    {
          lpCaptureBuffer->Lock(0, Buffersize/2, &SoundData1, &dwSoundDataSize1, 
                                  &SoundData2, &dwSoundDataSize2, 0); 
          memcpy(Array, SoundData1, Buffersize/2); 
        lpCaptureBuffer->Unlock(SoundData1, dwSoundDataSize1, SoundData2, 
                         dwSoundDataSize2); 
    	MessageBox(NULL, "fertig mit aufnehmen","", MB_OK); 
    
    }
    if(IsCapturing(lpCaptureBuffer)==TRUE)
    {MessageBox(NULL, "nimmt noch auf","", MB_OK);
    }
    }
    

    ich starte den Thread mit

    _beginthread(Thread,0,NULL);
    

    Aber irgendwie wird der thread nur einmal aufgerufen und danach nicht mehr was mach ich denn falsch??? Is die Sache mit dem thread überhaupt schnellgenug für FFT?

    Danke

    MFG

    Hansi



  • Wenn Du aus dem Thread rausgehst, denn beendet sich logischerweise der Thread (was soll er auch sonst tun!?).
    Wenn Du immer was im Thread tun willst, dann musst Du sowas wie ne Schleife da rein machen...

    Und nicht vergessen: Zugriff auf die selben Daten von zwei Threads müssen immer synchronisiert werden, sonst geht es schief... (Critical Section) ... ach so, tust Du ja mit dem "Lock/Unlock"...



  • alles klar, danke! hab mich schon gewundert... 😃 . Hab nämlich noch nie was mit threads gemacht...

    Danke!

    MFG

    Hansi



  • So habs hinbekommen. Es sind zwar minimale Knackser drin, aber das is kein Problem... Hätte nur nochmal ne Frage is das jetzt die schnellste Möglichkeit oder gibts noch schnellere Möglichkeiten die Sampledaten zu buffern?
    Würde mich mal interesieren...

    MFG

    Hansi



  • *WS_POPUP* 😉 😃


Anmelden zum Antworten