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



  • Jansen schrieb:

    DirectX wird ebenfalls in der FAQ behandelt,

    Ich sehe da gerade, DirectX8 gab es schon zu Zeiten des BCB5, da habe ich mich wohl etwas verschätzt. 🙄

    Die haben also 12 Jahre von DX8 bis DX11 gebraucht. Ok, dann sollte das auch im BCB6 gehen.



  • ...dann erhalte ich folgende Fehlermeldung :

    Laut M$ sollte man mit
    Dsound.h und
    Dsound.lib
    auskommen.

    Das Ergebnis ist diese Meldung :

    Der Prozedureinsprungpunkt "OpenVxDHandle" wurde in der DLL "KERNEL32.dll" nicht gefunden.

    na ja, ... und nu ... ???????



  • Elfe schrieb:

    und nu ...

    und nu passen Betriebssystemversion und oder installierte DirectX Version nicht zu dem was du da tun willst.



  • Hi,
    ich spiele Sounds seit dem CBuilder5 wie folgt ab:

    Es muss eingebunden werden:

    #include <Mmsystem.h>

    Abgespielt wird mit...

    AnsiString Sounddatei = ExtractFilePath(ParamStr(0)) + "\\Sounds\\CAMERA.wav";
    sndPlaySound(Sounddatei.c_str(),SND_SYNC);
    

    ..wobei gilt, dass im Projektpfad ein Unterverzeichnis "Sounds" vorhanden ist. In diesem Verzeichnis wird die *.wav, *.mp3 abgelegt.

    Gruß
    Torsten



  • Vorwort:
    Habe den Rechner defragmentiert und CBuilder neu installiert. Jetzt erhalte ich Kontakt zu DXSound. ( ... komisch, aber nu ... )

    Zum besseren Verständnis : > Was ich möchte :

    Mit DirectSound eine XXXXXX.wav einlesen.
    Dann (zB.) die Lautstärke der Datei verändern.
    Das Resultat wieder als Ausgabe.wav abspeichern.

    Erreicht habe ich :

    -DirectSoundCreate8________erfolgreich

    -CoInitialize_______________erfolgreich
    -CoCreateInstance_________erfolgreich
    -IDirectSound->Initialize_____erfolgreich
    -QueryInterface____________erfolgreich

    -CreateSoundBuffer_________fehlgeschlagen X 🙄

    -CreateBasicBuffer_________erfolgreich

    und nun soll man eine Wav-Datei einlesen, steht in der DX-Doku :

    Laden Sie wave-Daten in den Puffer. Zitat -> "Read data from a WAV file or resource into a private buffer." <- Das ist alles.

    Ja,... aber wiiiiiiiieeeeeeee denn ???? Wiiiiiieeeee macht man das ??? Das ist doch gerade die Frage, um die es geht!!!!!!!!!!!!!!!!!!!!

    Dazu steht wieder nichts drin. Das ist doch ...xxx...xxx... !!!!!!!
    Dabei würde ein einziges funktionierendes Beispiel genügen, an dem man sich orientieren könnte... [anstatt mit 20.000 M-Worten nichts zu sagen] [ Aber wenn noch nicht mal die Beispiele von M funktionieren............woran soll man sich dann noch orientieren, geschweige denn wovon lernen ??? ]

    soweit mein Problem.

    Gruß



  • Hi,
    das liegt nicht zwingend am BCB. Welches OS verwendest du?

    <CreateSoundBuffer> funktioniert mit DX8 (bzw. die SDK8) nicht mehr ab Vista, sondern nur bis DX9 -> WinXP.

    mfg



  • OS ?? Was ist das ??

    Habe
    BCB6
    und
    DX8 bzw 9 [ das DX8 DS-8 bleibt ja ]
    auf WinXP...

    Gruß



  • 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 );
    }
    //---------------------------------------------------------------------------
    

Anmelden zum Antworten