Warum, warum nur funktioniert der Sound nicht im CBuilder(6)...



  • OS = operating system = Betriebssystem
    Hast du ja aber schon genannt.



  • Hm, ok, vielleicht solltest du mal ein bißchen Code hier posten.
    Zumindest unter WinXP sollte CreateSoundBuffer funktionieren.

    Was ist der Returncode?

    mfg



  • Elfe schrieb:

    Vorwort:
    ....

    Erreicht habe ich :

    -DirectSoundCreate8________erfolgreich

    -CoInitialize_______________erfolgreich
    -CoCreateInstance_________erfolgreich
    -IDirectSound->Initialize_____erfolgreich
    -QueryInterface____________erfolgreich

    -CreateSoundBuffer_________fehlgeschlagen X 🙄

    -CreateBasicBuffer_________erfolgreich

    ...

    P.S: CoInitialize sollte vor DirectSoundCreate erfolgen.

    mfg



  • Hallo, Ihr da draußen,

    habs probiert, das Problem bleibt.

    ISnd- Create________geht
    ISnd- CaptureCreate _geht

    aber

    Snd- BufferCreate________geht nicht
    und
    Snd- CaptureBufferCreate _geht nicht

    Das finde ich komisch. Ich komme an die Schnittstelle dran,
    aber machen kann ich nichts damit. 🙄
    Und ohne Buffer kann ich ja gar nichts machen.

    [ getestet hab ich mit if(FAILED( etc. ... ]

    Gruß

    frohe Weihnacht an Alle.....



  • Hi,
    wie gesagt ohne Code und ohne genauen ReturnCode, also:

    Return code
    DSERR_ALLOCATED
    DSERR_BADFORMAT
    DSERR_BUFFERTOOSMALL
    DSERR_CONTROLUNAVAIL
    DSERR_DS8_REQUIRED
    DSERR_INVALIDCALL
    DSERR_INVALIDPARAM
    DSERR_NOAGGREGATION
    DSERR_OUTOFMEMORY
    DSERR_UNINITIALIZED
    DSERR_UNSUPPORTED

    Wird man dir schwer helfen können. Nur "geht nicht" ist eine nicht so gute Beschreibung des Problems.

    mfg und auch frohe Weihnachten 😉



  • Wie komme ich an diesen "Return-Code" denn dran ? Das kenne ich nicht.....
    Ich kenne bisher nur den bool if (FAILED(...

    Der Code ist halt genau der, der in der DX-Doku steht
    ( müsste ja eigentlich jeder von euch haben ... )
    aber wenns sein muss, schreib ich den auch nochmal hier hin...

    [... wollte halt nur nicht sinnlos etwas hinschreiben, was ohnehin
    jeder kennt ... ]
    -> siehe : Regeln ... nur den notwendigen und sinnvollen Code angeben.

    Gruß



  • Elfe schrieb:

    Wie komme ich an diesen "Return-Code" denn dran ? Das kenne ich nicht.....

    Diese Funktionen geben doch alle etwas vom Typ HRESULT zurück.

    FAILED und SUCCEEDED test doch nur, ob der Wert größer oder kleiner 0 ist.

    #define FAILED(hr) (((HRESULT)(hr)) < 0)
    #define SUCCEEDED(hr) (((HRESULT)(hr)) >= 0)
    

    lies mal

    http://msdn.microsoft.com/de-de/library/windows/desktop/ms679692%28v=vs.85%29.aspx
    usw.



  • Hallo nn,

    Der angegebene Link tuts nicht -> ... Die Seite msdn.microsoft.com wurde nicht gefunden. ...

    Ja, eine Zahl bekomme ich auch als Ergebnis. Aber was steckt dahinter ?
    Etwa 101, oder 107, 98 oder 96.... Aber das ist ja kein Return-Code.

    Wie erhalte ich aus hr einen Return-Code-Text wie DSERR_ALLOCATED ?
    Nur "hr" reicht ja nicht.

    Werd mal under M$ nachsehen, ob ich da was finden kann....

    Gruß



  • Elfe schrieb:

    Der angegebene Link tuts nicht -> ... Die Seite msdn.microsoft.com wurde nicht gefunden. ...

    Geht, habs gerade probliert. Firefox und IE.

    Elfe schrieb:

    Wie erhalte ich aus hr einen Return-Code-Text wie DSERR_ALLOCATED ?

    Ob man ohne Suchen dazu Text kriegt, weiß ich nicht. Die Makros zum Zerlegen der Zahlencodes stehen in dem Link.

    Wie die hr Nummern aufgebaut sind, wird auch in dem Link erklärt. Siehe "Structure of COM Error Codes".



  • Hallo nn, ( vorab -> Danke für Deine Mühe )
    Das hier habe ich herausgefunden ->

    Die DxErr9.lib muss eine ganz bestimmte sein.(Es gibt mehrere Versionen)
    Außerdem benötigt sie noch die DXErr9ab.dll
    sonst funktioniert der Return-Code nicht.

    Damit erhalte ich nun folgende Ergebnisse :

    Eingabe :_____________________Return-Code :

    DS-Create____________________Unknown
    CreateSoundBuffer_____________ERROR_EXCL_SEM_ALREADY_OWNED

    DS-CaptureCreate______________ERROR_INVALID_PASSWORD (->obwohl als erfolgreich gemeldet)
    CreateCaptureBuffer____________ERROR_DISK_CHANGE

    Das ist doch schonmal was. Kann man damit etwas anfangen ?

    Gruß



  • Hi,
    findest du es nicht ein bißchen seltsam, das z.b. "CreateCaptureBuffer" eine Fehlermeldung "ERROR_DISK_CHANGE" und "DS-CaptureCreate" "ERROR_INVALID_PASSWORD" zurückgeben soll?
    Hast du ein Passwort eingegeben? Ich glaube nicht.
    Die Returncodes sind außerdem kein Text, sondern eine Makro-Definition, die eine "Zahl" zurückgibt. ( zu finden in dsound.h ).
    Warum du dafür "DxErr9.lib" einbinden musst, erschließt sich mir auch nicht ganz.

    Da man weiterhin nicht sieht, was du tust -> Code, ist es ein munteres Raten woran es liegen könnte.

    [... wollte halt nur nicht sinnlos etwas hinschreiben, was ohnehin
    jeder kennt ... ]

    Manchmal ist es nur eine Kleinigkeit und dann ist es mit Sicherheit nicht sinnlos...

    Bis dahin werde ich mich hier erstmal raushalten.

    mfg



  • Sound1234 schrieb:

    Bis dahin werde ich mich hier erstmal raushalten.

    Ich auch, nach einem letzten Verweis auf

    http://msdn.microsoft.com/de-de/library/windows/desktop/ee416774%28v=vs.85%29.aspx
    (ja, der Link funktioniert)



  • Zunächt mal hallo,

    Ich weiß nicht, warum Ihr euch so aufregt ?
    Ich möchte etwas wissen, ( lernen ) und Ihr wollt von mir wissen, warum etwas wie ist ( geht ).
    Danach frage ich doch gerade hier.

    > findest du es nicht ein bißchen seltsam, das ... ... zurückgeben soll ?

    Nein, weshalb ? Woher soll ich wissen, wie das zustande kommt. Danach
    frage ich ja gerade hier. Außerdem hat mir niemand sagen können, wie ich an

    > Returncodes sind außerdem kein Text

    die Richtigen Infos drankomme und wie sie aussehen.

    > Warum du dafür "DXErr9.lib" einbinden musst, erschließt sich mir auch nicht ganz.

    Mir auch nicht. Es war die einzige Möglichkeit, dem Programm eine Antwort zu entlocken.
    Ich erhalte sonst nur "0".

    Ich versuche lediglich mit DSound zurechtzukommen. ( Und zu lernen, wie das geht )
    Ich weiß nicht, warum das nicht geht. Mit D3D habe ich keine Probleme. Und mit DMusic
    auch nicht. Aber man kann eben mit DMusic nicht speichern.

    Der Link funktioniert bei mir nicht. Ich weiß nicht, warum ?

    Und warum das

    > ... halte ich mich hier raus ... << ???????????

    Habe ich euch etwas getan ??????????????????

    Und hier also der Code ( ... aber beschwert euch bitte nicht, wenn es zu lang ist ... ) [ Wenn ihrs ausprobieren wollt, es braucht 5 Buttons, 2 Labels und
    ein Edit ]

    mit Gruß

    //---------------------------------------------------------------------------
    #include <vcl.h>
    #pragma hdrstop
    #include "Unit1.h"
    
    #include "windows.h" // für MessageBox
    
    //====================================
    
    #include "DSUtil.h"
    #include "dsound.h"
    
    IDirectSound*              SndSchnittSt;
    LPCGUID                    Fuehrer;
    
    IDirectSoundBuffer*        Puffer;
    DSBUFFERDESC*              Platte;
    
    IDirectSoundCapture*       SpSchnittSt;
    const GUID*                SpFuehrer;
    
    IDirectSoundCaptureBuffer* SpPuffer;
    const DSCBUFFERDESC*       SpPlatte;
    
    //====================================
    
    //---------------------------------------------------------------------------
    #pragma package(smart_init)
    #pragma resource "*.dfm"
    TForm1 *Form1;
    
    int Modus = 0;
    
    #include "dxerr9.h"
    
    //---------------------------------------------------------------------------
    __fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner)
    {
    }
    //---------------------------------------------------------------------------
    void __fastcall TForm1::Button1Click(TObject *Sender)
    {
      Modus = 1;
    
                                          if (FAILED(  //  if (SUCCEEDED(
      // Dies funktioniert
      DirectSoundCreate( Fuehrer,
                         &SndSchnittSt,
                         NULL
                       )                   ))
                                           {
                                            MessageBox( NULL,
                                                        "DirectSound Create\n    fehlgeschlagen!",
                                                        "Meldung :",
                                                        0
                                                      );
                                           }
                                          else
                                           {
    
                                            HRESULT Info;
    
                                            //Label1->Caption = Info; // > Ausgabe  96
                                            //Label1->Caption = DXGetErrorString9( Info );
                                            MEd->Text = Info;
    
                                            MessageBox( NULL,
                                                        "DirectSound Create\n    erfolgreich !",
                                                        "Meldung :",
                                                        0
                                                      );
                                              }
    }
    //---------------------------------------------------------------------------
    void __fastcall TForm1::Button2Click(TObject *Sender)
    {
                                                 if (FAILED(
       // Dies funktioniert NICHT
       SndSchnittSt->CreateSoundBuffer( Platte,
                                        &Puffer,
                                        NULL
                                      )
                                                 ))
                                                  {
    
                                                   HRESULT Info;
    
                                                   //Label1->Caption = Info; // > Ausgabe 101
                                                   //Label1->Caption = DXGetErrorString9( Info );
                                                   MEd->Text = Info;
    
                                                   MessageBox( NULL,
                                                              "Create SoundBuffer\n \nfehlgeschlagen!",
                                                              "Meldung :",
                                                              0
                                                            );
                                                   }
                                                 else
                                                   {
                                                    MessageBox( NULL,
                                                                "Create SoundBuffer\n \n   erfolgreich !",
                                                                "Meldung :",
                                                                0
                                                              );
                                                   }
    }
    //---------------------------------------------------------------------------
    void __fastcall TForm1::Button3Click(TObject *Sender)
    {
                                               if (FAILED(
        // Dies funktioniert ??
        DirectSoundCaptureCreate( SpFuehrer,
                                  &SpSchnittSt,
                                  NULL
                                )
                                               ))
                                                {
                                                 MessageBox( NULL,
                                                             "Capture Create\n \n   fehlgeschlagen!",
                                                             "Meldung :",
                                                             0
                                                           );
                                                }
                                               else
                                                {
    
                                                 HRESULT Info;
    
                                                 //Label1->Caption = Info; // > Ausgabe  86
                                                 //Label1->Caption = DXGetErrorString9( Info );
                                                 MEd->Text = Info;
    
                                                 MessageBox( NULL,
                                                             "Capture Create\n \n   erfolgreich !",
                                                             "Meldung :",
                                                             0
                                                           );
                                                }
    }
    //---------------------------------------------------------------------------
    void __fastcall TForm1::Button4Click(TObject *Sender)
    {
                                                    if (FAILED(
       // Dies funktioniert NICHT
       SpSchnittSt->CreateCaptureBuffer( SpPlatte,
                                         &SpPuffer,
                                         NULL
                                       )
                                                     ))
                                                      {
    
                                                       HRESULT Info;
    
                                                       //Label1->Caption = IntToStr(Info);  // > Ausgabe 107
                                                       //Label1->Caption = DXGetErrorString9( Info );
                                                       MEd->Text = Info;
    
                                                       MessageBox( NULL,
                                                                   "Create CaptureBuffer\n \n   fehlgeschlagen!",
                                                                   "Meldung :",
                                                                   0
                                                                 );
                                                       }
                                                      else
                                                       {
                                                        MessageBox( NULL,
                                                                    "Create CaptureBuffer\n \n   erfolgreich !",
                                                                    "Meldung :",
                                                                    0
                                                                  );
                                                       }
    }
    //---------------------------------------------------------------------------
    void __fastcall TForm1::FormClose(TObject *Sender, TCloseAction &Action)
    {
    
      if ( Modus == 0 ) MessageBox( NULL,
                                    "Erst \n DirectSoundCreate \n drücken !",
                                    "Meldung :",
                                    0
                                  );
    
      if ( SndSchnittSt )
         {
                                  if (FAILED(
      SndSchnittSt->Release()
                                   ))
                                   {
                                    MessageBox( NULL,
                                                "SndSchnittSt -> Release\n \n         fehlgeschlagen!",
                                                "Meldung :",
                                                0
                                              );
                                    }
                                  else
                                    {
                                     MessageBox( NULL,
                                                 "SndSchnittSt -> Release\n \n         erfolgreich !",
                                                 "Meldung :",
                                                 0
                                               );
                                    }
          }
    
      if (SpSchnittSt)
          {
                                  if (FAILED(
       SpSchnittSt->Release()
                                   ))
                                    {
                                     MessageBox( NULL,
                                                 "SpSchnittSt -> Release\n \n         fehlgeschlagen!",
                                                 "Meldung :",
                                                 0
                                               );
                                    }
                                  else
                                    {
                                     MessageBox( NULL,
                                                 "SpSchnittSt -> Release\n \n         erfolgreich !",
                                                 "Meldung :",
                                                 0
                                               );
                                    }
           }
    }
    //---------------------------------------------------------------------------
    void __fastcall TForm1::Button5Click(TObject *Sender)
    {
    
        int CodeIndex = StrToInt(Edit1->Text);
        MEd->Text = CodeIndex;
    
        //Label1->Caption = Meldung;  // > Ausgabe 107
        Label1->Caption = DXGetErrorString9( CodeIndex );
    
    }
    //---------------------------------------------------------------------------
    
    void __fastcall TForm1::MEdChange(TObject *Sender)
    {
        int CodeIndex = StrToInt(MEd->Text);
        //Label1->Caption = Meldung;  // > Ausgabe 107
        Label1->Caption = DXGetErrorString9( CodeIndex );
    }
    //---------------------------------------------------------------------------
    


  • Elfe schrieb:

    Ich weiß nicht, warum Ihr euch so aufregt ?

    Angesichts der Dauer der Diskussion (seit dem 17.11.) verlieren wir halt die Lust dir zu helfen.

    Elfe schrieb:

    Mit D3D habe ich keine Probleme. Und mit DMusic
    auch nicht.

    Daran habe ich nach kurzem überfliegen deines Quelltextes Zweifel.

    Elfe schrieb:

    Der Link funktioniert bei mir nicht. Ich weiß nicht, warum ?

    Das gehört auch zu den Dingen, die ich nicht nachvollziehen kann.

    So, nun zu deinem Program

    // Gekürzter Auszug
    HRESULT Info;
    
    MEd->Text = Info;
    

    Du legst da eine nicht initialisierte Variable an, sprich mit zufälligem Inhalt. Was bringt dich dazu zu glauben, der Inhalt hätte irgendwas mit dem Rückgabewert einer Funktion zu tun ?

    Man ruft das so auf

    HRESULT Info = Irgendeine_COM_Funktion();
    

    dann kannst du damit trotzdem noch z.B.

    if ( FAILED(Info) )
    

    verwenden, aber auch z.B. mit dem Debugger nachsehen, was da zurück gekommen ist.

    Tut mir leid, ich verliere wirklich die Lust zu antworten.



  • .

    Muss man hier eigentlich

    Informatik studiert haben

    um hier eine Frage zu stellen ??? 🙄

    .



  • .

    DirectSoundCreate____________S_OK

    - CreateSoundBuffer__________-2147024____E_INVALIDARG

    DirectSoundCaptureCreate_____S_OK

    - CreateCaptureBuffer________-2147024____E_INVALIDARG

    .



  • Der erste Parameter von IDirectSound8::CreateSoundBuffer muss die Adresse einer DSBUFFERDESC-Struktur sein, in der der zu erstellende Soundbuffer beschrieben wird. Du übergibst einen uninitialisierten Zeiger.



  • Elfe schrieb:

    .
    Muss man hier eigentlich
    Informatik studiert haben
    um hier eine Frage zu stellen ??? 🙄
    .

    Nein sicher nicht. Aber man sieht an deinem Code und deiner Fragestellung, dass noch erheblicher Nachholbedarf an Basiswissen besteht (nicht böse gemeint). Und es ist halt einfach etwas anstrengend, jemandem ohne diesem Basiswissen zu helfen.

    Aber mit dem Returnvalue E_INVALIDARG und der Antwort von MFK, sollte die Problemlösung einfach sein.
    Deshalb bat ich auch um deinen Code...woher hätte man sonst sehen sollen, was du da an was übergibst.

    mfg



  • Sound schrieb :

    ...Nachholbedarf an Basiswissen besteht...

    ...Woher soll man (ich) es denn haben, wenn es keine Bücher dazu gibt, auch im Internet nichts zu finden ist. Erklären tut es einem ja keiner. Nur beschweren tun sich alle, wenn man etwas nicht weiß. Also versucht man, aus dem was man finden kann, aus tausend Quellen, etwas zusammen zu basteln. Und wer nicht mag, braucht ja nicht zu antworten. Ich zwinge Niemanden.

    Danke MfK. ( ...auch für die konkrete Antwort )Sieh mal das Ergebnis :

    DS-Create________________0___S_OK
    CreateSoundBuffer_________0___S_OK
    DS-CaptureCreate__________0___S_OK
    CreateCaptureBuffer________0___S_OK

    Wenn das kein Erfolg ist ?!?!

    Nur

    if ( Buffer ) Buffer->Release;
    

    erzeugt Zugriffsverletzungen. Warum das ?
    Es soll doch nur dann ein Release geben, wenn es einen Buffer gibt, ...sonst nicht. 🙄

    Bei if ( SndSchnittSt ) SndSchnittSt->Release funktioniert das doch auch.
    Warum beim Buffer nicht ?

    Gruß



  • Elfe schrieb:

    Sound schrieb :

    ...Nachholbedarf an Basiswissen besteht...

    ...Woher soll man (ich) es denn haben, wenn es keine Bücher dazu gibt, auch im Internet nichts zu finden ist. Erklären tut es einem ja keiner.

    In Sachen Informatik/Programmierung wird dir selten jemand den Arsch nachtragen. Einen Großteil der Fehler/Fortschritte meistert man durch Eigenrecherche im Internet.

    Da gepostete Link bei dir nicht funktioniert, aber bei jedem anderen, scheinst du nicht nur ein Problem mit deiner Soundausgabe, sondern auch mit deinem Browser zu haben. Ich würde erstmal das zweite Problem angehen.


Anmelden zum Antworten