Jump to content
Annons

Recommended Posts

Posted (edited)

Hej,

Jag gör ett audio software i Visual c++ 2005, som skall klara av att spela upp och in. Ljudkortet är PCI-424, som har flera IO kanaler, men dessa kanaler kommer jag inte åt.

Jag använder mig av Steninbergs ASIO API, och har dessutom laddat ner ASIO sdk och föröker provköra de sample som följer med. Sampeln skall kunna hitta alla kanaler hos ljukortet men den verkar inte ens finna drivrutinen för ASIO...

VAD kan det beror på.

Även sampeln är skriven i Visual c++.

Jag är säkert på att jag har drivrutinerna för ASIO eftersom jag har laddat ner ett gratis program som kallas för SLAB som klarar av att kartlägga alla existerande ljudkanaler.

Är det någon som känner till detta problem, hjälp.

Har kört fast nu länge....

Edited by helen
Annons
Guest tsmalmbe
Posted (edited)

Jag har själv ingen erfarenhet av programmeringsspråket du använder, men jag önskar dig lycka till!

Edited by tsmalmbe
Posted

Ok, nu fattar jag ett annat inlägg. (håll dig gärna till samma tråd)

Förmodligen så har du två olika sorters drivrutiner tillgängliga i Windows och sampeln hanterar inte vilken den ska välja. Är inte alls säker, men har du fått ASIO att funka i windows annars och exemplet kompilerar utan att klaga så borde det vara nåt i systemet.

Detta är nog lite fel forum för dig för här tror jag man kan räkna C++ under Win32-kodarna på en hand.

Posted
Du berättar inte ens med vad det är du programmerar?
Jag gör ett audio software i Visual c++ 2005, som skall klara av att spela upp och in

Helen gjorde en EDIT efter han skrivit sitt svar 😳

Posted
Jag fattar inte detta!

Är en sampel ett program i detta fall, alltså inte en bara ett inspelat ljud vilket man kan hantera i ett program.

Ett kodexempel. Hehe, väldigt förvirrande just här...

Guest Danny Cort
Posted
tråd test

funkar det?

Posted
Helen gjorde en EDIT efter han skrivit sitt svar 😄

Är Helen en han? 😕

Guest Danny Cort
Posted
Helen gjorde en EDIT efter han skrivit sitt svar 😄

Är Helen en han? 😕

Det tänkte jag också på...

Posted

Till Vacum,

Jag har tagit bort alla andra asio drivers och nu har jag enbart en version av det.

Ändå kvarstår problemmet.

För att komma åt dll filen så anger jag enbart sökvägen på följande sätt

#define ASIO_PATH "C:\Documents and Settings\VERA362\MyDocuments\

ASIO\SDK\host\asio4all.dll"

Är det fel sätt att försöka komma åt dll:en, hur skull man annars göra det.

Nedan är koden:

#include <windows.h>

#include "iasiodrv.h"

#include "asiolist.h"

#include "stdio.h "

#define ASIODRV_DESC "description"

#define INPROC_SERVER "InprocServer32"

#define ASIO_PATH "C:\Documents and Settings\VERA362\My Documents\ASIO SDK\host\asio4all.dll" //"software\\asio"

//#define ASIO_PATH "asio4all.dll" //"software\\asio"

#define COM_CLSID "clsid"

// ******************************************************************

// Local Functions

// ******************************************************************

static LONG findDrvPath (char *clsidstr,char *dllpath,int dllpathsize)

{

printf("findDrvPath (char *clsidstr,char *dllpath,int dllpathsize)\n\n");

HKEY hkEnum,hksub,hkpath;

char databuf[512];

LONG cr,rc = -1;

DWORD datatype,datasize;

DWORD index;

OFSTRUCT ofs;

HFILE hfile;

BOOL found = FALSE;

CharLowerBuff(clsidstr,strlen(clsidstr));

if ((cr = RegOpenKey(HKEY_CLASSES_ROOT,COM_CLSID,&hkEnum)) == ERROR_SUCCESS) {

index = 0;

while (cr == ERROR_SUCCESS && !found) {

cr = RegEnumKey(hkEnum,index++,(LPTSTR)databuf,512);

if (cr == ERROR_SUCCESS) {

CharLowerBuff(databuf,strlen(databuf));

if (!(strcmp(databuf,clsidstr))) {

if ((cr = RegOpenKeyEx(hkEnum,(LPCTSTR)databuf,0,KEY_READ,&hksub)) == ERROR_SUCCESS) {

if ((cr = RegOpenKeyEx(hksub,(LPCTSTR)INPROC_SERVER,0,KEY_READ,&hkpath)) == ERROR_SUCCESS) {

datatype = REG_SZ; datasize = (DWORD)dllpathsize;

cr = RegQueryValueEx(hkpath,0,0,&datatype,(LPBYTE)dllpath,&datasize);

if (cr == ERROR_SUCCESS) {

memset(&ofs,0,sizeof(OFSTRUCT));

ofs.cBytes = sizeof(OFSTRUCT);

hfile = OpenFile(dllpath,&ofs,OF_EXIST);

if (hfile) rc = 0;

}

RegCloseKey(hkpath);

}

RegCloseKey(hksub);

}

found = TRUE; // break out

}

}

}

RegCloseKey(hkEnum);

}

return rc;

}

static LPASIODRVSTRUCT newDrvStruct (HKEY hkey,char *keyname,int drvID,LPASIODRVSTRUCT lpdrv)

{

HKEY hksub;

char databuf[256];

char dllpath[MAXPATHLEN];

WORD wData[100];

CLSID clsid;

DWORD datatype,datasize;

LONG cr,rc;

if (!lpdrv) {

if ((cr = RegOpenKeyEx(hkey,(LPCTSTR)keyname,0,KEY_READ,&hksub)) == ERROR_SUCCESS) {

datatype = REG_SZ; datasize = 256;

cr = RegQueryValueEx(hksub,COM_CLSID,0,&datatype,(LPBYTE)databuf,&datasize);

if (cr == ERROR_SUCCESS) {

rc = findDrvPath (databuf,dllpath,MAXPATHLEN);

//rc = findDrvPath (databuf,ASIO_PATH,MAXPATHLEN);

if (rc == 0) {

lpdrv = new ASIODRVSTRUCT[1];

if (lpdrv) {

memset(lpdrv,0,sizeof(ASIODRVSTRUCT));

lpdrv->drvID = drvID;

MultiByteToWideChar(CP_ACP,0,(LPCSTR)databuf,-1,(LPWSTR)wData,100);

if ((cr = CLSIDFromString((LPOLESTR)wData,(LPCLSID)&clsid)) == S_OK) {

memcpy(&lpdrv->clsid,&clsid,sizeof(CLSID));

}

datatype = REG_SZ; datasize = 256;

cr = RegQueryValueEx(hksub,ASIODRV_DESC,0,&datatype,(LPBYTE)databuf,&datasize);

if (cr == ERROR_SUCCESS) {

strcpy(lpdrv->drvname,databuf);

}

else strcpy(lpdrv->drvname,keyname);

}

}

}

RegCloseKey(hksub);

}

}

else lpdrv->next = newDrvStruct(hkey,keyname,drvID+1,lpdrv->next);

return lpdrv;

}

static void deleteDrvStruct (LPASIODRVSTRUCT lpdrv)

{

IASIO *iasio;

if (lpdrv != 0) {

deleteDrvStruct(lpdrv->next);

if (lpdrv->asiodrv) {

iasio = (IASIO *)lpdrv->asiodrv;

iasio->Release();

}

delete lpdrv;

}

}

static LPASIODRVSTRUCT getDrvStruct (int drvID,LPASIODRVSTRUCT lpdrv)

{

while (lpdrv) {

if (lpdrv->drvID == drvID) return lpdrv;

lpdrv = lpdrv->next;

}

return 0;

}

// ******************************************************************

// ******************************************************************

// AsioDriverList

// ******************************************************************

AsioDriverList::AsioDriverList ()

{

HKEY hkEnum = 0;

char keyname[MAXDRVNAMELEN];

LPASIODRVSTRUCT pdl;

LONG cr;

DWORD index = 0;

BOOL fin = FALSE;

numdrv = 0;

lpdrvlist = 0;

//cr = RegOpenKey(HKEY_LOCAL_MACHINE,0,&hkEnum);

cr = RegOpenKey(HKEY_LOCAL_MACHINE,ASIO_PATH,&hkEnum);

while (cr == ERROR_SUCCESS) {

if ((cr = RegEnumKey(hkEnum,index++,(LPTSTR)keyname,MAXDRVNAMELEN))== ERROR_SUCCESS) {

lpdrvlist = newDrvStruct (hkEnum,keyname,0,lpdrvlist);

}

else fin = TRUE;

}

if (hkEnum) RegCloseKey(hkEnum);

pdl = lpdrvlist;

while (pdl) {

numdrv++;

pdl = pdl->next;

}

if (numdrv) CoInitialize(0); // initialize COM

}

AsioDriverList::~AsioDriverList ()

{

if (numdrv) {

deleteDrvStruct(lpdrvlist);

CoUninitialize();

}

}

LONG AsioDriverList::asioGetNumDev (VOID)

{

return (LONG)numdrv;

}

LONG AsioDriverList::asioOpenDriver (int drvID,LPVOID *asiodrv)

{

LPASIODRVSTRUCT lpdrv = 0;

long rc;

if (!asiodrv) return DRVERR_INVALID_PARAM;

if ((lpdrv = getDrvStruct(drvID,lpdrvlist)) != 0) {

if (!lpdrv->asiodrv) {

rc = CoCreateInstance(lpdrv->clsid,0,CLSCTX_INPROC_SERVER,lpdrv->clsid,asiodrv);

if (rc == S_OK) {

lpdrv->asiodrv = *asiodrv;

return 0;

}

// else if (rc == REGDB_E_CLASSNOTREG)

// strcpy (info->messageText, "Driver not registered in the Registration Database!");

}

else rc = DRVERR_DEVICE_ALREADY_OPEN;

}

else rc = DRVERR_DEVICE_NOT_FOUND;

return rc;

}

LONG AsioDriverList::asioCloseDriver (int drvID)

{

LPASIODRVSTRUCT lpdrv = 0;

IASIO *iasio;

if ((lpdrv = getDrvStruct(drvID,lpdrvlist)) != 0) {

if (lpdrv->asiodrv) {

iasio = (IASIO *)lpdrv->asiodrv;

iasio->Release();

lpdrv->asiodrv = 0;

}

}

return 0;

}

LONG AsioDriverList::asioGetDriverName (int drvID,char *drvname,int drvnamesize)

{

LPASIODRVSTRUCT lpdrv = 0;

if (!drvname) return DRVERR_INVALID_PARAM;

if ((lpdrv = getDrvStruct(drvID,lpdrvlist)) != 0) {

if (strlen(lpdrv->drvname) < (unsigned int)drvnamesize) {

strcpy(drvname,lpdrv->drvname);

}

else {

memcpy(drvname,lpdrv->drvname,drvnamesize-4);

drvname[drvnamesize-4] = '.';

drvname[drvnamesize-3] = '.';

drvname[drvnamesize-2] = '.';

drvname[drvnamesize-1] = 0;

}

return 0;

}

return DRVERR_DEVICE_NOT_FOUND;

}

LONG AsioDriverList::asioGetDriverPath (int drvID,char *dllpath,int dllpathsize)

{

LPASIODRVSTRUCT lpdrv = 0;

if (!dllpath) return DRVERR_INVALID_PARAM;

if ((lpdrv = getDrvStruct(drvID,lpdrvlist)) != 0) {

if (strlen(lpdrv->dllpath) < (unsigned int)dllpathsize) {

strcpy(dllpath,lpdrv->dllpath);

return 0;

}

dllpath[0] = 0;

return DRVERR_INVALID_PARAM;

}

return DRVERR_DEVICE_NOT_FOUND;

}

LONG AsioDriverList::asioGetDriverCLSID (int drvID,CLSID *clsid)

{

LPASIODRVSTRUCT lpdrv = 0;

if (!clsid) return DRVERR_INVALID_PARAM;

if ((lpdrv = getDrvStruct(drvID,lpdrvlist)) != 0) {

memcpy(clsid,&lpdrv->clsid,sizeof(CLSID));

return 0;

}

return DRVERR_DEVICE_NOT_FOUND;

}

Posted

Hej hopp... Jag har inte programmerat på länge, och kan vara ute och cykla. Men detta är vad jag får ut av koden efter att ha kollat lite snabbt..

Först en fråga: ASIO_PATH, har du lagt till detta själv, eller fanns det från början?

Nedan ser ut som ett gäng generella funktioner. Funktionerna i sig ger inget synligt eller hörbart resultat, utan hjälper dig att hitta lämplig ASIO drivrutin och använda den.

Funktioner som enumererar (kan inte termerna), loopar igenom och letar upp samtliga ASIO drivrutiner som finns installerade på den maskinen som programmet körs i. Någon sökväg ska du alltså inte behöva ange, utan funktionen nedan fixar det åt dig.

Jag antar att det finns något mer exempel där dom använder funktionerna och dessutom gör något? I så fall hade jag försökt kika på dom exemplen, och lämna nedan orört för stunden.

Tyvärr programmerar jag knappt längre, och har aldrig kollat på ASIO tidigare, så mer än så kan jag inte hjälpa.

Posted

Hej,

Från början såg macro delen ut som nedan men jag bytte ut det till asio.dll filens sök, men jag antar att det är fel och har änderat detta

tillbaks till den ursprungliga och nu verkar den gå in i funktionen findDrivePath men fortfarande finner den inte drivern.....

#define ASIO_PATH "software\\asio"

Jag förstår dock inte varför man skriver som: "software\\asio"

Posted (edited)

Då var jag nog ute och cyklade lite ändå :rolleyes:

Testa följande en gång:

#define ASIO_PATH "C:\\Documents and Settings\\VERA362\\My Documents\\ASIO SDK\\host"

Eller kanske som du gjorde, fast med dubbla "\". Du använder \x för att lägga in kontrolltecken, där du ersätter x med lämpligt tecken. Så för att få ett \ anger man två stycken: \\

Tillägg:

Det finns ingen katalog någonstans bland det du har laddat ner som heter just "asio"? I så fall kanske det är sökvägen dit du ska ange?

ps. Jag gissar fortfarande väldigt mycket, så hoppas någon som faktiskt kan programmera kan komma fler tips 🙂

Edited by Jonte
Posted

Hej igen!

Nej, det är ändå snällt av dig att du försöka hjälpa till, men men det verkar inte fungera fortfarnade........

tack i allafall

Posted

Utan att ha satt mig in i appen (vilket är otroligt frustrerande när det inte finns med tab, jag blir helt yr av att läsa detdär) så är ju första definerade funktionen något som ska hitta sökvägen till drivrutinen. Dessutom tror jag det är meningen att systemet ska presentera ASIO-drivaren och inte programmet som ska leta reda på dll-filen (men det är jag inte helt säker på). Mitt tips är att du letar reda på ett forum där mer kompetenta VC++ kodare finns. Jag är helt grön när det gäller Win32, och har aldrig ens provat ASIO API/SDK. Internet måste garanterat krylla av forum som passar dig bättre.

Posted

Hej

Nu kör jag själv bara C++ och Java på sistonde och mest i unix miljö...

Kan dock kommentera att i allmänhet brukar det inte vara så bra att ha pather med space i... som tex C:\\Documents and Settings\\ så jag rekommenderar dig att lägga din dll någon annanstans.

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...

Important Information

We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.