Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

1

15.01.2009, 17:34

Unlock von LPDIRECTSOUNDBUFFER endet mit E_INVALIDARG

Hi an alle,

ich möchte einen Wave Sound mit DSound abspielen. Dieser Sound ist als Wave Resource eingebunden.
Also lade ich zuerst die Resource. Das funzt auch.
Dann Initialisiere ich directsound, lese die Wave Information aus, kreiere den Buffer und möchte den Sound dann abspielen. Locken tut er noch, Speicher kopieren ebenfalls aber bei Unlock halt ausgang mit E_INVALIDARG.
Hier mal mein Code:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
BOOL CDXPlaySound::InitDirectSound(HWND hWnd) 
{ 
    DSBUFFERDESC soundBuffDesc; 

    if(DirectSoundCreate(NULL, &m_lpSound, NULL) != DS_OK) 
    { 
        return FALSE; 
    } 

    if(m_lpSound->SetCooperativeLevel(hWnd, DSSCL_NORMAL) != DS_OK) 
    { 
        return FALSE; 
    } 
    GetWaveFormatFromResource(); 
    ZeroMemory(&soundBuffDesc, sizeof(DSBUFFERDESC)); 
    soundBuffDesc.dwSize = sizeof(soundBuffDesc); 
    soundBuffDesc.dwFlags = DSBCAPS_STATIC; 
    soundBuffDesc.dwBufferBytes = m_dwWaveSize;    
    soundBuffDesc.lpwfxFormat = m_wfx; 

    if(m_lpSound->CreateSoundBuffer(&soundBuffDesc, &m_lpPrim, NULL) != DS_OK) 
    { 
        return FALSE; 
    } 
    return TRUE; 

} 

//Organisieren aller Wave Informationen der Ressource 

BOOL CDXPlaySound::GetWaveFormatFromResource() 
{ 
    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 0; 
} 

bool CDXPlaySound::ReadWaveToBuffer() 
{    
    DWORD dwSize1;  
        
    
    /*if(m_lpSound->CreateSoundBuffer(&dsbd,lpDsBuff, NULL) != DS_OK) 
    { 
        return false; 
    }*/ 
    HRESULT hRes; 
    if(m_lpPrim->Lock(0, 0, 
                        &lpvBuff1, 
                        &dwSize1, 
                        0, 
                        0,  
                        DSBLOCK_ENTIREBUFFER ) != DS_OK) 
    { 
        return false; 
    } 
    /*int nSize = ((dwSize1 + dwSize2)/2); 
    if(nSize > 0)*/ 
        
    ::CopyMemory(lpvBuff1, m_lpvData, dwSize1); 

    //if(lpvBuff2) // write second part if the ringbuffer is overlapped 

    //     memcpy(lpvBuff2, (char*)m_lpvData+dwSize1, dwSize2); 

    if((hRes = m_lpPrim->Unlock(&lpvBuff1, dwSize1, 0, 
                        0)) != DS_OK) 
    { 
        //hier dann hRes = E_INVALIDARG. 

        return false; 
    } 
    return true; 
}


Kann mir jemand sagen wo mein Fehler liegt, ich konnte nichts rausfinden auch nicht mit googles hilfe.

Gruß
Karsten
Arbeitswut ist eine psychische Störung, die schon mit einer Tasse Kaffee und einem netten Gespräch geheilt werden kann

2

16.01.2009, 09:06

Ok Problem gelöst.
Lag daran, dass Unlock keinen LPVOID* verlangt. Die Derefenzierung rausgenommen und jetzt klappt es:D

Gruß
Arbeitswut ist eine psychische Störung, die schon mit einer Tasse Kaffee und einem netten Gespräch geheilt werden kann