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

Anonymous

unregistriert

11

24.10.2006, 14:51

Kann es sein das du einen Flag DSBCAPS_LOCHARDWARE benutzt? Onboard chips haben keine Hardware unterstützung. Das geht in die Hose.

Benutze mal DSBCAPS_LOCSOFTWARE um abspielen per Software zu erzwingen oder besser automatische Wahl DSBCAPS_DEFER. Sollte diese fehlschlagen und software funktionieren dann taugen deine Treiber des Boards nichts.

Mal so ne Vermutung.

cu

Firefly

Alter Hase

  • »Firefly« ist der Autor dieses Themas

Beiträge: 484

Wohnort: Irgendwoundnirgendwo

  • Private Nachricht senden

12

24.10.2006, 19:24

Also ich hab DSBCAPS_LOCDEFER benutzt.....

Anonymous

unregistriert

13

24.10.2006, 19:48

Ich kopier hier mal knallhart BlitzmaxCode rein ^^.

Quellcode

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
Method InitAudioStream()
    
        Local result:Int
        Local nChannels:Short       = 1     ; If STREAM_FORMAT = MM_STEREO8 Or STREAM_FORMAT = MM_STEREO16 Then nChannels = 2
        Local wBitsPerSample:Short  = 16    ; If STREAM_FORMAT = MM_MONO8 Or STREAM_FORMAT = MM_STEREO8 Then wBitsPerSample = 8     

        ' CREATE THE WAVE FORMAT STRUCTURE    
        wfx.wFormatTag      = WAVE_FORMAT_PCM
        wfx.nChannels       = nChannels
        wfx.nSamplesPerSec  = SAMPLE_RATE   'nSamplesPerSec
        wfx.wBitsPerSample  = wBitsPerSample
        wfx.nBlockAlign     = (wBitsPerSample / 8 * nChannels)
        wfx.nAvgBytesPerSec = (SAMPLE_RATE * wfx.nBlockAlign)   '(nSamplesPerSec * wfx.nBlockAlign)
    
        ' CREATE THE SECONDARY BUFFER STRUCTURE
        dsbd.dwSize         = SizeOf(dsbd)
        dsbd.dwFlags        = DSBCAPS_CTRLVOLUME|DSBCAPS_CTRLFREQUENCY|DSBCAPS_CTRLPAN|DSBCAPS_STATIC|DSBCAPS_LOCDEFER|DSBCAPS_GETCURRENTPOSITION2|DSBCAPS_GLOBALFOCUS
        dsbd.dwBufferBytes  = STREAM_BUFFER_SIZE
        dsbd.lpwfxFormat    = wfx
    
        ' CREATE THE SECONDARY BUFFER INTERFACE
        Result = TAudioDevice.dsi.CreateSoundBuffer(dsbd,Varptr(pDSB),Null)
        PrintDSoundError(result,"CreateSoundBuffer")
   
    EndMethod

Quellcode

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
ype TMaxModAudioDriver Extends TAudioDriver


    Method CreateSound:TSound( sample:TAudioSample,loop_flag:Int )

        Local channels:Int,bits:Int,format:Int,length:Int,result:Int
        
        Select sample.format
?BigEndian
            Case SF_MONO16LE    ; sample=sample.Convert(SF_MONO16BE)
            Case SF_STEREO16LE  ; sample=sample.Convert(SF_STEREO16BE)
?LittleEndian
            Case SF_MONO16BE    ; sample=sample.Convert(SF_MONO16LE)
            Case SF_STEREO16BE  ; sample=sample.Convert(SF_STEREO16LE)
?
        End Select
        
        length=sample.length
        Select sample.format
            Case SF_MONO8                       ; channels = 1 ; bits=8  ; 
            Case SF_STEREO8                     ; channels = 2 ; bits=8  ; length:*2
            Case SF_MONO16LE, SF_MONO16BE       ; channels = 1 ; bits=16 ; length:*2
            Case SF_STEREO16LE, SF_STEREO16BE   ; channels = 2 ; bits=16 ; length:*4
        EndSelect
            
        Local snd:TMaxModAudioSound = New TMaxModAudioSound
    
        snd.SAMPLERATE = sample.hertz
    
        ' CREATE THE WAVE FORMAT STRUCTURE    
        snd.wfx.wFormatTag              = WAVE_FORMAT_PCM
        snd.wfx.nChannels               = Channels
        snd.wfx.nSamplesPerSec          = sample.hertz
        snd.wfx.wBitsPerSample          = bits
        snd.wfx.nBlockAlign             = bits / 8 * Channels
        snd.wfx.nAvgBytesPerSec         = sample.hertz * snd.wfx.nBlockAlign
    
        ' CREATE THE SECONDARY BUFFER STRUCTURE
        snd.dsbd.dwSize         = SizeOf(snd.dsbd)
        snd.dsbd.dwFlags        = DSBCAPS_CTRLVOLUME|DSBCAPS_CTRLFREQUENCY|DSBCAPS_CTRLPAN|DSBCAPS_STATIC|DSBCAPS_LOCDEFER|DSBCAPS_GETCURRENTPOSITION2|DSBCAPS_GLOBALFOCUS
        snd.dsbd.dwBufferBytes  = length
        snd.dsbd.dwReserved     = Null
        snd.dsbd.lpwfxFormat    = snd.wfx
    
        ' CREATE THE SECONDARY BUFFER INTERFACE
        Result = TAudioDevice.dsi.CreateSoundBuffer(snd.dsbd,Varptr(snd.pDSB),Null) ; PrintDSoundError(result,"CreateSoundBuffer")

        Local lpvWrite:Int, dwLength:Int, lpvWrite1:Int, dwLength1:Int
        If snd.pDSB.Lock(0,length,Varptr(lpvWrite),Varptr(dwLength),Varptr(lpvWrite1),Varptr(dwLength1),0) = DS_OK 
            MemCopy(Byte Ptr(lpvWrite), Varptr(Sample.Samples[0]), length)
        EndIf

        Return snd
        
    End Method
    
    Method AllocChannel:TChannel()
        Local Channel:TMaxModAudioChannel = New TMaxModAudioChannel
        Return Channel
    End Method
    
End Type










Type TAudioDevice

    Global dsi              :IDirectSound8      = Null
    Global DSBPrimary       :IDirectSoundBuffer = Null
    Global PrimaryDSBDesc   :DSBUFFERDESC       = New DSBUFFERDESC
    
    Function Init()
    
        PrimaryDSBDesc.dwSize   = SizeOf(PrimaryDSBDesc)
        PrimaryDSBDesc.dwFlags  = DSBCAPS_PRIMARYBUFFER

        Local Result:Int = DirectSoundCreate8( Null, Varptr(dsi), Null )        ; PrintDSoundError(result,"DirectSoundCreate8")
        Result = dsi.SetCooperativeLevel( GetActiveWindow(), DSSCL_PRIORITY )   ; PrintDSoundError(result,"SetCooperativeLevel")
        Result = dsi.CreateSoundBuffer(PrimaryDSBDesc, Varptr(DSBPrimary),Null) ; PrintDSoundError(result,"CreateSoundBuffer")
        
    EndFunction

    Function Release_()
        dsi         = Null
        DSBPrimary  = Null
        GCCollect()
    EndFunction

EndType


Leider gibt es nicht so viele Sound interessierte wie Grafik Freaks. Vielleicht hilft dir das weiter. Wir müssen da Sprachübergreifend zusammenhalten. :roll:

cu

Anonymous

unregistriert

14

24.10.2006, 20:37

Wenn wir hier schon Code posten, dann bitte auch C++. ;)
Hier mal meine DirectSound Klasse.

directsound.h

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
#pragma once

#include <windows.h>
#include <dsound.h>

#pragma comment (lib, "dsound.lib")

namespace core
{
    class buffer_manager;
    class sounds;

    class directsound
    {
    private:
        directsound  (void);
        ~directsound (void);

    public:
        inline static directsound &getInst (void)
        {
            static directsound inst;
            return inst;
        }

        friend class buffer_manager;
        friend class sounds;

        int init (::HWND__* hWnd);
        void shutdown (void);

    private:
        ::IDirectSound8*            direct_sound;
        ::IDirectSoundBuffer*       primary_buffer;
    };
}


directsound.cpp

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
#include "directsound.h"

namespace core
{
    directsound::directsound (void) : direct_sound(NULL), primary_buffer(NULL)
    {
    }
    directsound::~directsound (void)
    {
        shutdown ();
    }

    int directsound::init (::HWND__* hWnd)
    {
        ::WAVEFORMATEX waveformat;
        ::DSBUFFERDESC desc;
        ::ZeroMemory (&desc, sizeof(::DSBUFFERDESC));

        if(::DirectSoundCreate8 (NULL, &direct_sound, NULL) != DS_OK)
        {
            ::MessageBoxW (NULL, L"Direct Sound Objekt konnte nicht erstellt werden!", L"Error", MB_ICONERROR);
            return 0;
        }

        if(direct_sound->SetCooperativeLevel (hWnd, DSSCL_EXCLUSIVE) != DS_OK)
        {
            ::MessageBoxW (NULL, L"Direct Sound Kooperations Level konnte nicht gesetzt werden!", L"Error", MB_ICONERROR);
            return 0;
        }

        desc.dwSize     = sizeof(::DSBUFFERDESC);
        desc.dwFlags    = DSBCAPS_PRIMARYBUFFER;

        if(direct_sound->CreateSoundBuffer (&desc, &primary_buffer, NULL) != DS_OK)
        {
            ::MessageBoxW (NULL, L"Primärer Soundpuffer konnte nicht erstellt werden!", L"Error", MB_ICONERROR);
            return 0;
        }

        waveformat.wFormatTag       = WAVE_FORMAT_PCM;
        waveformat.nChannels        = 2;
        waveformat.nSamplesPerSec   = 44100;
        waveformat.wBitsPerSample   = 16;
        waveformat.nBlockAlign      = waveformat.nChannels * waveformat.wBitsPerSample / 8;
        waveformat.nAvgBytesPerSec  = waveformat.nSamplesPerSec * waveformat.nBlockAlign;
        waveformat.cbSize           = 0;

        if (primary_buffer->SetFormat (&waveformat) != DS_OK)
        {
            ::MessageBoxW (NULL, L"Sound Format konnte nicht gesetzt werden!", L"Error", MB_ICONERROR);
            return 0;
        }

        return 1;
    }

    void directsound::shutdown (void)
    {
        if(primary_buffer != NULL) 
        {
            primary_buffer->Release();
            primary_buffer = NULL;
        }

        if(direct_sound != NULL)
        {
            direct_sound->Release();
            direct_sound = NULL;
        }
    }
}


Funktioniert nur mit einem Sound, da musst du dir halt einen Buffer
Manager schreiben, will dir ja nicht alles in den ... ähhh vorgeben. ;)
Sounds abspielen und stoppen, usw solltest du auch hinbekommen, ist
ja wunderbar einfach. Hier aber nochmal eine Funktion zum laden
von Sounds (Die ich im Buffer Manager habe):

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
        ::IDirectSoundBuffer* buffer_;
        ::ZeroMemory (&buffer, sizeof (::IDirectSoundBuffer*));

        ::WAVEFORMATEX wave_format;
        ::DSBUFFERDESC buffer_desc;
        ::HMMIO__*     wave_file;
        ::MMCKINFO     parent;
        ::MMCKINFO     child;
        ::ZeroMemory (&buffer_desc, sizeof(::DSBUFFERDESC));
        ::ZeroMemory (&parent,      sizeof(::MMCKINFO));
        ::ZeroMemory (&child,       sizeof(::MMCKINFO));

        void *write_one = 0;
        void *write_two = 0;

        unsigned long length_one = 0;
        unsigned long length_two = 0;

        wave_file = ::mmioOpenW (file, 0, MMIO_READ | MMIO_ALLOCBUF);

        if (wave_file == NULL)
        {
            return 0;
        }

        parent.fccType = mmioFOURCC ('W', 'A', 'V', 'E');
        ::mmioDescend (wave_file, &parent, 0, MMIO_FINDRIFF);
        
        child.fccType = mmioFOURCC ('f', 'm', 't', ' ');
        ::mmioDescend (wave_file, &child, &parent, 0);

        ::mmioRead (wave_file, reinterpret_cast <char*> (&wave_format), sizeof(wave_format));

        if(wave_format.wFormatTag != WAVE_FORMAT_PCM)
        {
            return 0;
        }

        ::mmioAscend (wave_file, &child, 0);
        child.ckid = mmioFOURCC ('d', 'a', 't', 'a');
        ::mmioDescend (wave_file, &child, &parent, MMIO_FINDCHUNK);

        buffer_desc.dwSize        = sizeof (::DSBUFFERDESC);
        buffer_desc.dwFlags       = 0;
        buffer_desc.dwBufferBytes = child.cksize;
        buffer_desc.lpwfxFormat   = &wave_format;

        if((core::directsound::getInst().direct_sound->CreateSoundBuffer (&buffer_desc, &buffer_, NULL)) != DS_OK)
        {
            return 0;
        }

        buffer_->Lock (0, child.cksize, &write_one, &length_one, &write_two, &length_two, 0);

        if (write_one > 0)
        ::mmioRead (wave_file, reinterpret_cast <char*> (write_one), length_one);

        if (write_two > 0)
        ::mmioRead (wave_file, reinterpret_cast <char*> (write_two), length_two);

        buffer_->Unlock (write_one, length_one, write_two, length_two);

        ::mmioClose (wave_file, 0);


Ich hoffe ich konnte dir helfen. Benutze selber eine OnBoard Sound Karte
und es funktioniert bei mir.

Firefly

Alter Hase

  • »Firefly« ist der Autor dieses Themas

Beiträge: 484

Wohnort: Irgendwoundnirgendwo

  • Private Nachricht senden

15

26.10.2006, 14:54

vielen dank. mit deinem code riddick, funktionierts. Liegt wohl irgendwie am auslesen der Datei(wobei es per manuellem buffer auch nicht funktioniert hat,...naja)

Werbeanzeige