Vorkompilierte PortAudio.dll in Projekt einbinden via Teamviewer



  • Hallo zusammen,

    ich suche jemanden mit C++ Erfahrungen und ggfls. mit PortAudio-Erfahrungen der/die bereit wäre mir via Teamviewer und Audio-Chat zu erklären wie ich eine vorkompilierte PortAudio 1.8 - DLL in meinem C++ Projekt "konsumieren" kann und eine Hilfestellung bei PA_Initialize und dem PA_Callback geben könnte für mein Audio-Projekt (es geht darum eine Callback-Funktion von PortAudio meines virtuellen Synthesizers aufzurufen).

    Meine Test-Funktion generiert einen Sinus-Ton, diesen würde ich gerne (bei erfolgreichem Abschluss meiner Frage) mittels WASAPI unterbrechungsfrei auf der Soundkarte ausgeben.

    Wichtig ist hier, dass PortAudio eine C-Schnittstelle bereitstellt, die ich jedoch in C++ konsumieren möchte (hierzu gibt die FAQ von PortAudio eine Hilfestellung, die mir aber mangels Erfahrung in Unmanged C++ nicht so wirklich klar ist).

    Ich schätze den Aufwand auf max. ca. 1,5 Stunden für einen erfahrenen C++ Entwickler.

    Dafür möchte ich gerne 25 Euro (Verhandlungsbasis) per Banküberweisung zum 01.12.13 anbieten.

    Ich bitte Interessent(en)/(innen) sich bei mir via E-Mail zu melden:
    mailto:mathias.maerker@outlook.com

    Viele Grüße
    Mathias



  • du must die DLL zuerst in den Adressraum deines Prozesses laden:

    HMODULE WINAPI LoadLibrary(
    _In_ LPCTSTR lpFileName <-- Pfad zur DLL, z.B. C:\audio.dll
    );

    Gut, nun ist die DLL von deinem Prozess aus "sichtbar".
    Die DLL hat Funktionen, die sie bereitstellt. Lade dir Dependency Walker runter, damit kannst du sehen, welche Funktionen die DLL anbietet und wie diese heißen.
    In der Doku der Audio DLL solltest du das aber auch finden können.

    So, du weißt nun wie die Funktion heißt, die du brauchst?
    Na dann hol dir die Funktionsadresse!

    FARPROC WINAPI GetProcAddress(
    _In_ HMODULE hModule, <-- hier Handle einfügen, den du von LoadLibrary bekommen hast
    _In_ LPCSTR lpProcName <-- Name der Funktion (siehe DependencyWalker)
    );

    Nun hast du die Funktionsadresse.
    Jetzt kannst du die Funktion bereits aufrufen, naja, fast.
    Du musst den Typ der Funktion kennen. Das findest du in der Doku, und wahrscheinlich gibt es auch eine Headerdatei wo die Funktionstypen bereits deklariert sind.

    Siehe dazu auch das Thema Funktionszeiger.
    Beispielsweise für die Funktion void irgendwas(int); sieht der Funktionszeigertyp so aus:
    void (*FuncPtr_t)(int);

    Jetzt wo du den Typ hast, kannst du eine Variable anlegen, die die Adresse der DLL Funktion speichert.
    FuncPtr_t meineFunktion=GetProcAddress(...);

    Ab jetzt kannst du ganz normal mit der Funktion arbeiten, wie du es eben von Funktionen gewöhnt bist, also z.B. meineFunktion(42); aufrufen.

    Wie du die Funktionen verwendest entnimmst du am besten der Doku.

    Wichtig ist hier, dass PortAudio eine C-Schnittstelle bereitstellt, die ich jedoch in C++ konsumieren möchte (hierzu gibt die FAQ von PortAudio eine Hilfestellung, die mir aber mangels Erfahrung in Unmanged C++ nicht so wirklich klar ist).

    DLLs bieten immer eine C Schnittstelle, und das ist auch gut so.
    Mit der C SChnittstelle können alle anderen Sprachen auch, mit C++ hingegen nicht.
    Du kannst dir aber einen "Wrapper" um die blanken C Funktionen schreiben.


Anmelden zum Antworten