Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » Allgemeines (OffTopic) » Directaudio

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 < [ 2 ]
000
03.10.2003, 11:33 Uhr
Oliver
S2-Pixelgeneral


Hallo!

Ich weiß, dass es hier nicht sehr viele "DirectX-er" gibt, aber da ich in meinem Spielprogrammierforum leider keine Antwort so richtig kriege, frag ich hier mal nach, vielleicht weiß es ja jemand.

Also, ich hab mir die DirectAudio-Funktionen gekapselt:


C++:
class Audio
{
    IDirectMusicPerformance8*Perfomance;
    IDirectMusicLoader8 *Loader;

public:

    bool Init(const HWND &hwnd,const char*search_directory);
    bool Load(const char*filename,Sound *seg);
    bool Play(const Sound &seg);
    void Stop(const Sound &seg);
    bool IsPlaying(const Sound &seg);
    ~Audio();

};

class Sound
{
    IDirectMusicSegment8*m_segment;

public:
    friend class Audio;
    ~Sound();

};

bool Audio::Init(const HWND &hwnd,const char*search_directory)
{


    unsigned short sd2[260];

    CoInitialize(NULL);

    CoCreateInstance(CLSID_DirectMusicPerformance,NULL,CLSCTX_INPROC,IID_IDirectMusicPerformance8,(LPVOID*)&Perfomance);
    CoCreateInstance(CLSID_DirectMusicLoader,NULL,CLSCTX_INPROC,IID_IDirectMusicLoader8,(LPVOID*)&Loader);



    MultiByteToWideChar(CP_ACP,0,search_directory,-1,sd2,260);




    if(FAILED(Perfomance->InitAudio(NULL,NULL,NULL,DMUS_APATH_DYNAMIC_STEREO,64,DMUS_AUDIOF_ALL,NULL)))
        return 0;

    if(FAILED(Loader->SetSearchDirectory(GUID_DirectMusicAllTypes,sd2,0)))
        return 0;

    return 1;

}

bool Audio::Load(const char *filename,Sound *seg)
{
    unsigned short filename2[260];

    MultiByteToWideChar(CP_ACP,0,filename,-1,filename2,260);

    if(FAILED(Loader->LoadObjectFromFile(CLSID_DirectMusicSegment,IID_IDirectMusicSegment8,filename2,(LPVOID*)&seg->m_segment))) return 0;




    seg->m_segment->Download(Perfomance);

    return 1;

}

bool Audio::Play(const Sound &seg)
{
   return SUCCEEDED(Perfomance->PlaySegmentEx(seg.m_segment,NULL,NULL,DMUS_SEGF_SECONDARY,0,NULL,NULL,NULL));

}

void Audio::Stop(const Sound &seg)
{
    Perfomance->Stop(seg.m_segment,NULL,0,0);
}

Audio::~Audio()
{
    if(Perfomance)
    {
        Perfomance->Stop(NULL,NULL,0,0);
        Perfomance->CloseDown();
        Perfomance->Release();
        Perfomance=NULL;

    }

    if(Loader)
    {
        Loader->Release();
        Loader=NULL;
    }

    CoUninitialize();

}

bool Audio::IsPlaying(const Sound &seg)
{

    if( seg.m_segment == NULL || Perfomance == NULL )
        return 0;

    return ( Perfomance->IsPlaying( seg.m_segment, NULL ) == S_OK );
}

Sound::~Sound()
{
    if(m_segment)
    {
        m_segment->Release();
        m_segment=NULL;
    }
}




Das erste mal wenn ich es abspielen will, wird es nur fehlerhaft abgespielt, beim 2. Mal gar nichts mehr. Wenn ich wieder neu starte, geht der Spaß wieder von vorne los.

Ich sitz an dem Problem schon fast seit einer Woche kann mir jemand helfen?


--
Demokratie ist die Diktatur der Mehrheit.

www.siedler25.org/ ( Siedler2 - Remake )
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
03.10.2003, 15:30 Uhr
Pablo
Supertux
(Operator)


Ich hatte schon mal die SDK von DirectX gelesen, vor langer Zeit, für VB und VC++, aber für VC++ habe ich kein wort verstanden. Viellceicht bringt es, wenn du dir die SDK runterlädst und die DirecAudio Tutorials anschaust.
--
A! Elbereth Gilthoniel!
silivren penna míriel
o menel aglar elenath,
Gilthoniel, A! Elbereth!
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
03.10.2003, 16:05 Uhr
Oliver
S2-Pixelgeneral


Naja, ich hatt mir ja ein Buch gekauft(JLI Visual C++ und DirectX9).
Da wurde auch so eine Klasse gemacht, die mir aber nicht gefällt. Deswegen wollt ich mir meine eigene machen. Ich hab auch schon verglichen, aber ich find einfach keinen Fehler...
--
Demokratie ist die Diktatur der Mehrheit.

www.siedler25.org/ ( Siedler2 - Remake )
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
03.10.2003, 17:00 Uhr
FloSoft
Medialer Over-Flow
(Administrator)


Hast du schonmal eine andere Musikdatei ausprobiert?
--
class God : public ChuckNorris { };
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
03.10.2003, 17:33 Uhr
Oliver
S2-Pixelgeneral


Das ist ja komisch.

Meine selbstgemachten Midis(mit Vivaldi Plus) werden immer fehlerhaft abgespielt, andere dagegen und Wavs nicht.

Aber trotzdem werden sie danach nicht nochmal abgespielt, erst wenn ich den computer neu hochgefahren habe, geht es noch einmal und dann immer so weiter.

Vielleicht mach ich irgendwas bei den Destruktoren falsch, aber ich hat schonmal geguckt und hab wie gesagt nichts gefunden.
--
Demokratie ist die Diktatur der Mehrheit.

www.siedler25.org/ ( Siedler2 - Remake )
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
03.10.2003, 17:38 Uhr
Pablo
Supertux
(Operator)


Wie wäre es wenn, du die komplette Klasse kopierst und nur die Stellen, die dir nicht gefallen änderst?
--
A! Elbereth Gilthoniel!
silivren penna míriel
o menel aglar elenath,
Gilthoniel, A! Elbereth!
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
03.10.2003, 17:48 Uhr
Oliver
S2-Pixelgeneral


Ich zeig euch mal die Klasse von dem Buch, die einwandfrei geht:


C++:

#include <dmusici.h>

#pragma warning(disable: 4786)

#include <string>
#include <map>

using namespace std;

// Definition der Klasse DirectXAudio

class DirectXAudio
{
     public:

        ~DirectXAudio();

        // DirectXAudio initialisieren
        void Init(void);
        
        // Musik und Soundeffekte hinzufügen
        void AddBackgroundMusic(string Name);
        void AddSound(string Name);

        // Musik und Soundeffekte abspielen
        void PlayBackgroundMusic(void);
        void PlaySoundEffect(string Name);

    private:

        // DirectXMusic Objekte
        IDirectMusicPerformance8* lpPerformance;
        IDirectMusicLoader8*      lpLoader;
        IDirectMusicSegment8*     lpSegBackgroundMusic;
        
        
        map<string,IDirectMusicSegment8*> SoundEffectsMap;

        // die Hintergrundmusik
        string bgMusic;
};



void DirectXAudio::Init(void)
{
    // COM initialisieren
    CoInitialize(NULL);
    
    CoCreateInstance(CLSID_DirectMusicPerformance, NULL,
                     CLSCTX_INPROC, IID_IDirectMusicPerformance8,
                     (void**)&lpPerformance );
    
    CoCreateInstance(CLSID_DirectMusicLoader, NULL,
                     CLSCTX_INPROC, IID_IDirectMusicLoader8,
                     (void**)&lpLoader);


    // Initialisieren
    lpPerformance->InitAudio(
        NULL,                  
        NULL,                  
        NULL,                  
        DMUS_APATH_DYNAMIC_STEREO,
        8,                    
        DMUS_AUDIOF_ALL,      
        NULL                  
    );
    
    // Suchpfad auswählen
    WCHAR wstrSearchPath[MAX_PATH];
    MultiByteToWideChar( CP_ACP, 0, "../../media", -1, wstrSearchPath, MAX_PATH );

    // Suchpfad setzen
    lpLoader->SetSearchDirectory(GUID_DirectMusicAllTypes,  
        wstrSearchPath,            
        FALSE                      
    );

}


void DirectXAudio::AddBackgroundMusic(string Name)
{
    // Name der Datei
    WCHAR wstrFileName[MAX_PATH];
      
    MultiByteToWideChar(CP_ACP,0,Name.c_str(),-1,wstrFileName,MAX_PATH);

    if (FAILED(lpLoader->LoadObjectFromFile(
        CLSID_DirectMusicSegment,  
        IID_IDirectMusicSegment8,  
        wstrFileName,              
        (LPVOID*) &lpSegBackgroundMusic)))
    {
        MessageBox( NULL, "Fehler beim Laden der Datei",
                          "AddBackgroundMusic", MB_OK );  
    }

    // Segment hinzufügen
    lpSegBackgroundMusic->Download( lpPerformance );
}


void DirectXAudio::AddSound(string Name)
{
    WCHAR wstrFileName[MAX_PATH];
    
    MultiByteToWideChar(CP_ACP,0,Name.c_str(),-1,wstrFileName,MAX_PATH);

    if (FAILED(lpLoader->LoadObjectFromFile(
        CLSID_DirectMusicSegment,  
        IID_IDirectMusicSegment8,  
        wstrFileName,              
        (LPVOID*) &SoundEffectsMap[Name])))
    {
        MessageBox( NULL, "Fehler beim Laden der Datei","AddSound", MB_OK );
        return;
    }

    // Segment hinzufügen
    SoundEffectsMap[Name]->Download(lpPerformance);  
}


void DirectXAudio::PlayBackgroundMusic(void)
{
  lpPerformance->PlaySegmentEx(
        lpSegBackgroundMusic,           // abzuspielendes Segment
        NULL,        
        NULL,        
        DMUS_SEGF_SECONDARY,  // im sekundären Buffer
        0,                    // Stelle, an der gestartet werden soll
        NULL,        
        NULL,        
        NULL        
    );  
}

void DirectXAudio::PlaySoundEffect(string Name)
{
    lpPerformance->PlaySegmentEx(
        SoundEffectsMap[Name],           // abzuspielendes Segment
        NULL,        
        NULL,        
        DMUS_SEGF_SECONDARY,  // im sekundären Buffer
        0,                    // Stelle, an der gestartet werden soll
        NULL,        
        NULL,        
        NULL        
    );  
}

DirectXAudio::~DirectXAudio()
{
    map<string,IDirectMusicSegment8*>::iterator it;
    for(it=SoundEffectsMap.begin();it!=SoundEffectsMap.end();it++)    
    {
        (*it).second->Release();
    }
    

    // Segment freigeben
    if(lpSegBackgroundMusic)
    {
        lpSegBackgroundMusic->Release();
        lpSegBackgroundMusic = NULL;
    }
  
    // performance freigeben
    if(lpPerformance)
    {
        lpPerformance->Stop(NULL,NULL,0,0);
        lpPerformance->CloseDown();
        lpPerformance->Release();
        lpPerformance = NULL;
    }

    // Loader freigeben
    if(lpLoader)
    {
        lpLoader->Release();
        lpLoader = NULL;
    }

    // COM beenden
    CoUninitialize();
}



--edit: Pablo. Smilies deaktiviert. --
--
Demokratie ist die Diktatur der Mehrheit.

www.siedler25.org/ ( Siedler2 - Remake )

Dieser Post wurde am 03.10.2003 um 18:25 Uhr von Pablo Yanez Trujillo editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
03.10.2003, 19:23 Uhr
FloSoft
Medialer Over-Flow
(Administrator)


Haste halt irgendwo nen Fehler in deiner Klasse, auch wenn ich keinen beim durchlesen gefunden habe
--
class God : public ChuckNorris { };
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
008
03.10.2003, 19:36 Uhr
Pablo
Supertux
(Operator)


Und wie wäre es, wenn du deine Klasse Audio von der anderen ableitest?
--
A! Elbereth Gilthoniel!
silivren penna míriel
o menel aglar elenath,
Gilthoniel, A! Elbereth!
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
009
03.10.2003, 19:51 Uhr
Oliver
S2-Pixelgeneral


Die "Buchklasse" hat ja ein ganz anderes system, wie soll ich die ableiten?
--
Demokratie ist die Diktatur der Mehrheit.

www.siedler25.org/ ( Siedler2 - Remake )
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 < [ 2 ]     [ Allgemeines (OffTopic) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: