Jump to content
Annons

Recommended Posts

Postat (redigerat)

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....

Redigerat av helen
Annons
tsmalmbe (oregistrerad)
Postat (redigerat)

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

Redigerat av tsmalmbe
Postat

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.

Postat
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 😳

Postat
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...

Danny Cort (oregistrerad)
Postat
trÄd test

funkar det?

Postat
Helen gjorde en EDIT efter han skrivit sitt svar 😄

Är Helen en han? 😕

Danny Cort (oregistrerad)
Postat
Helen gjorde en EDIT efter han skrivit sitt svar 😄

Är Helen en han? 😕

Det tÀnkte jag ocksÄ pÄ...

Postat

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;

}

Postat

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.

Postat

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"

Postat (redigerat)

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 🙂

Redigerat av Jonte
Postat

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

Postat

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.

Postat

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.

Bli medlem (kostnadsfritt) eller logga in för att kommentera

Du behöver vara medlem för att delta i communityn

Bli medlem (kostnadsfritt)

Bli medlem kostnadsfritt i vÄr community genom att registrera dig. Det Àr enkelt och kostar inget!

Bli medlem nu (kostnadsfritt)

Logga in

Har du redan en inloggning?
Logga in hÀr.

Logga in nu
×
×
  • Skapa ny...

Viktig information om kakor (cookies)

Vi har placerat nÄgra kakor pÄ din enhet för att du bÀttre ska kunna anvÀnda den hÀr sajten. LÀs vÄr kakpolicy och om hur du kan Àndra instÀllningar. Annars utgÄr vi frÄn att du Àr bekvÀm med att fortsÀtta.