waveOutReset hängt sich weg.



  • Hi an alle,

    So nun habe ich das mit dem Abspielen aus der Resource am laufen. Arbeite hier mit den waveOut... Methoden aus der Windows Media Lib. Nun möchte ich einen gerade laufenden Sound unterbrechen. Wie gehe ich hier am besten vor?
    Ich habe versucht mit waveOutReset doch dann bleibe ich in der Methode hängen.

    Hier mal auf die schnelle was ich mache.

    //Laden der Resource 
    ... 
    HINSTANCE hApp = ::GetModuleHandle(0); 
    HRSRC hResInfo = FindResource(hApp, MAKEINTRESOURCE(m_nResId), L"WAVE");   m_hRes = LoadResource(hApp, hResInfo); 
    m_lpRes = (LPSTR)LockResource(m_hRes); 
    ... // klappt wunderbar 
    
    ... 
    //WaveFormat auslesen 
    DWORD* pRes = (DWORD*)m_lpRes; 
        DWORD dwRiff = *pRes++; 
        DWORD dwLength = *pRes++; 
        DWORD dwType = *pRes++; 
    
        if(dwRiff != mmioFOURCC('R', 'I', 'F', 'F')) 
            return false; 
    
        if(dwType != mmioFOURCC('W', 'A', 'V', 'E')) 
            return false; 
    
        DWORD * pResEnd = (DWORD *)((BYTE *)pRes + dwLength-4); 
    
        while( pRes < pResEnd ) 
        { 
             dwType = *pRes++; 
              dwLength = *pRes++; 
            switch(dwType) 
            { 
                case mmioFOURCC('f', 'm', 't', ' '): 
                    if( !m_wfx ) 
                    { 
                            if( dwLength < sizeof(WAVEFORMAT) ) 
                                return false;     
    
                            m_wfx = (WAVEFORMATEX *)pRes; 
    
                            /*if( m_wfx ) 
                                return true;*/ 
                        } 
                break; 
                case mmioFOURCC('d', 'a', 't', 'a'): 
                    m_lpvData = (LPVOID)pRes; 
                    m_dwWaveSize = dwLength; 
                    if(m_wfx) 
                        return true; 
                break; 
            } 
        } 
        return true; 
    ... 
    
    // waveOutOpen aufrufen 
    ... 
    waveOutOpen(...) 
    ... 
    
    ... 
    //Und dann solange Buffer Inhalt hat abspielen. 
    m_dwStart = (dwStart == -1) ? 0 : dwStart * m_wfx->nBlockAlign; 
        m_dwEnd = (dwEnd == -1) ? m_wfx->nSamplesPerSec * m_wfx->nBlockAlign : __min((m_wfx->nSamplesPerSec * m_wfx->nBlockAlign), dwEnd) * m_wfx->nBlockAlign; 
        m_nWaveHdrIndex = 2; 
    for(i = 0; i < 2; i++) 
    { 
    Play(); 
    } 
    
    //Play 
    MMRESULT mmr; 
        m_nWaveHdrIndex = (m_nWaveHdrIndex == 2) ? 0 : m_nWaveHdrIndex + 1; 
        m_whdr[m_nWaveHdrIndex].lpData = (LPSTR)m_lpvData + m_dwStart; 
        m_whdr[m_nWaveHdrIndex].dwBufferLength = GetBufferLength(); 
        m_whdr[m_nWaveHdrIndex].dwFlags = 0; 
        m_whdr[m_nWaveHdrIndex].dwUser = (DWORD)(void*)this; 
        if((mmr = waveOutPrepareHeader(hWaveOut, &m_whdr[m_nWaveHdrIndex], sizeof(WAVEHDR))) != MMSYSERR_NOERROR) 
            return false; 
        if((mmr = waveOutWrite(hWaveOut, &m_whdr[m_nWaveHdrIndex], sizeof(WAVEHDR))) != MMSYSERR_NOERROR) 
        { 
            waveOutUnprepareHeader(hWaveOut, &m_whdr[m_nWaveHdrIndex], sizeof(WAVEHDR)); 
            m_whdr[m_nWaveHdrIndex].lpData = NULL; 
            m_whdr[m_nWaveHdrIndex].dwBufferLength = 0; 
            m_whdr[m_nWaveHdrIndex].dwFlags = 0; 
            m_whdr[m_nWaveHdrIndex].dwUser = NULL; 
            m_nWaveHdrIndex--; 
              return false; 
        } 
        m_dwStart += GetBufferLength(); 
        return true; 
    
    //Nun versuche ich mittendrin zu unterbrechen hier die Stop Methode 
        FreeResource(m_hRes); 
        MMRESULT mmr = 0; 
        m_dwStart = m_dwEnd; 
        if(m_hWaveOut != NULL) 
            mmr = waveOutReset(m_hWaveOut); //hier ist dann Feierabend. 
        if(mmr != MMSYSERR_NOERROR) 
            return false; 
        return true;
    

    Was könnte ich hier noch falsch machen?



  • Weil ich grade im Petzold den 22. Kapitel "Sound" lese, wollte ich mal helfen. Nun gebe ich verzweifelt auf und behaupte, kein Mensch kann den Codeausschnitt debuggen. Das solltest Du zuerst mal durchlesen: http://www.c-plusplus.net/forum/viewtopic-var-t-is-229653.html



  • Ev. "FreeResource(m_hRes);" an der falschen Stelle aufgerufen ?


Anmelden zum Antworten