Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Soundkarten lange Namen - waveOutGetDevCaps

93 views
Skip to first unread message

Martin KoWi

unread,
May 4, 2012, 10:09:54 AM5/4/12
to
Hallo zusammen,

ich brauche die Namen der installierten Audiotreiber.
Das ist soweit kein Problem, allerdings werden die Namen auf 16 zeichen
beschnitten.
Das ist nicht nur unschön, sondern bei langen Namen auch uneindeutig.
Laut MSDN ist aber ProductName(1 To 32) As Byte deklariert.
Selbst wenn ich hier einen größeren Buffer vorsehe, bekomme ich nur die
ersten 32 Bytes/16 Zeichen befüllt.
Weiß wer wie ich an die vollständigen Namen komme?

Unten ein Code-Bsp.

danke, martin.

--------------------
Private Declare Function waveOutGetDevCaps Lib "winmm.dll" _
Alias "waveOutGetDevCapsA" (ByVal uDeviceID As Long, _
lpCaps As WaveOutCaps, ByVal uSize As Long) As Long

Private Declare Function waveOutGetNumDevs Lib "winmm.dll" () As Long

Private Type WaveOutCaps
ManufacturerID As Integer
ProductId As Integer
DriverVersion As Long
ProductName(1 To 32) As Byte
Formats As Long
Channels As Integer
dwSupport As Long
End Type

Private Sub CheckDevs()
Dim Caps As WaveOutCaps
Dim i As Long
Dim sName As String

For i = 0 To waveOutGetNumDevs - 1
Call waveOutGetDevCaps(i, Caps, Len(Caps))
sName = TrimNull(StrConv(Caps.ProductName, vbUnicode))
Debug.Print "Dev " & i & ": " & sName
Next i

End Sub
--------------------

Thorsten Albers

unread,
May 4, 2012, 5:50:45 PM5/4/12
to
Martin KoWi <martin....@gmx.net> schrieb im Beitrag
<jo0nvj$10c$1...@dont-email.me>...
> Selbst wenn ich hier einen größeren Buffer vorsehe, bekomme ich nur die
> ersten 32 Bytes/16 Zeichen befüllt.

Da Du die ANSI-Version der Funktion verwendest:
32 Bytes/32(!) Zeichen (inkl. terminierendem Null-Zeichen)

Wenn Du die UNICODE-Version verwenden würdest:
64 Bytes/32 Zeichen (inkl. terminierendem Null-Zeichen)

> Weiß wer wie ich an die vollständigen Namen komme?
>
> Private Declare Function waveOutGetDevCaps Lib "winmm.dll" _
> Alias "waveOutGetDevCapsA" (ByVal uDeviceID As Long, _
> lpCaps As WaveOutCaps, ByVal uSize As Long) As Long
>
> Private Declare Function waveOutGetNumDevs Lib "winmm.dll" () As Long
>
> Private Type WaveOutCaps
> ManufacturerID As Integer
> ProductId As Integer
> DriverVersion As Long
> ProductName(1 To 32) As Byte
> Formats As Long
> Channels As Integer

Hier fehlt noch ein
Reserved1 As Integer

> dwSupport As Long
> End Type

Aber beim eigentlichen Problem hilft das natürlich nicht weiter... :-(

--
Thorsten Albers

gudea at gmx.de

Martin KoWi

unread,
May 5, 2012, 2:52:11 AM5/5/12
to
Am 04.05.2012 23:50, schrieb Thorsten Albers:

> Da Du die ANSI-Version der Funktion verwendest
...
> Hier fehlt noch ein
> Reserved1 As Integer

Danke für den Hinweis auf die fehlerhaften Deklarationen, das kommt von
copy/paste.

> Aber beim eigentlichen Problem hilft das natürlich nicht weiter... :-(

Leider !
ich habe schon lange gegoogelt, aber ausser unzähligen gleichlautenden
Fragen keine Lösungen gefunden.

Also die Frage bleibt offen.

trotzdem danke,
martin.

Wolfgang Badura

unread,
May 5, 2012, 5:35:59 AM5/5/12
to
Hallo Martin!
"Martin KoWi" <martin....@gmx.net> schrieb im Newsbeitrag
news:jo2ims$vb6$1...@dont-email.me...
> Am 04.05.2012 23:50, schrieb Thorsten Albers:
>
>> Da Du die ANSI-Version der Funktion verwendest
> ...
>> Hier fehlt noch ein
>> Reserved1 As Integer
>
> Danke für den Hinweis auf die fehlerhaften Deklarationen, das kommt von
> copy/paste.
>
>> Aber beim eigentlichen Problem hilft das natürlich nicht weiter... :-(
>
> Leider !
> ich habe schon lange gegoogelt, aber ausser unzähligen gleichlautenden
> Fragen keine Lösungen gefunden.

Vielleicht hilft Dir WMI / Win32_SystemDriver.
Diese Klasse enthält neben dem 32 bytes umfassenden Namen noch Caption und
Derscription,
deren Längen wesentlich größer sind und vielleicht auch das enthalten, was
Du suchst.

Näheres unter
http://msdn.microsoft.com/en-us/library/windows/desktop/aa394472(v=vs.85).aspx
Ein Beispiel findest Du unter
http://www.scriptinternals.de/new/ger/support/Internal/WMI_Win32_SystemDriver.htm

Wolfgang


Thorsten Albers

unread,
May 5, 2012, 5:25:43 PM5/5/12
to
Martin KoWi <martin....@gmx.net> schrieb im Beitrag
<jo2ims$vb6$1...@dont-email.me>...
> Leider !
> ich habe schon lange gegoogelt, aber ausser unzähligen gleichlautenden
> Fragen keine Lösungen gefunden.
>
> Also die Frage bleibt offen.

'Mal andersherum gesehen: Du erwartest an dieser Stelle offenbar unter
gewissen Umständen eine bestimmte Zeichenfolge, deren Länge über 31 Zeichen
(32 inkl. NULL-Zeichen) hinausgeht.

MMSYSTEM.H enthält jedoch die folgende Konstantendefinition:
#define MAXPNAMELEN 32 /* max product name length (including NULL) */

Daraus schließe ich, daß der Produktname niemals länger als 32 bzw. 31
Zeichen sein kann!

Wenn Du schon einen längeren Namen gesehen hast, dann wird der vermutlich
auf andere Weise ermittelt worden sein, etwa - wie von Wolfgang
vorgeschlagen - über WMI oder durch direktes Auslesen der Registry.

Martin KoWi

unread,
May 6, 2012, 5:57:12 AM5/6/12
to
Am 05.05.2012 11:35, schrieb Wolfgang Badura:

> Vielleicht hilft Dir WMI / Win32_SystemDriver.
> Diese Klasse enthält neben dem 32 bytes umfassenden Namen noch Caption und
> Derscription,

Hallo Wolfgang,

Danke für den Tip, das war einen Versuch wert.
Leider sind die WaveOut-Namen da nicht dabei.

Da kommen alle möglich Treiber/Service-Namen wie zb:
AEAudio Service
Audiostubtreiber
Microsoft Kernel-Waveaudiomixer

aber leider nicht die WaveOuts, schade.

schönen gruß,
martin.

Martin KoWi

unread,
May 6, 2012, 6:14:14 AM5/6/12
to
Am 05.05.2012 23:25, schrieb Thorsten Albers:

> 'Mal andersherum gesehen: Du erwartest an dieser Stelle offenbar unter
> gewissen Umständen eine bestimmte Zeichenfolge, deren Länge über 31 Zeichen
> (32 inkl. NULL-Zeichen) hinausgeht.

Nein, ich erwarte es nicht an DIESER Stelle -
ich will wissen WIE ich die langen Namen bekomme!

> Daraus schließe ich, daß der Produktname niemals länger als 32 bzw. 31
> Zeichen sein kann!

ich meine die "sprechenden Namen" die man in jeder Audio-SW auswählen
kann (oder zb. Skype).
Das ergibt dann bei mir: "Lautsprecher (Realtek High Defi"
also sehr verkürzt. Fast jedes aktuelle System hat solche langen Namen.

Der Tip mit WMI war gut, aber auch da ist es nicht dabei.

gruß, martin.

Thorsten Albers

unread,
May 6, 2012, 5:13:53 PM5/6/12
to
Martin KoWi <martin....@gmx.net> schrieb im Beitrag
<jo5itn$v2p$1...@dont-email.me>...
> ich meine die "sprechenden Namen" die man in jeder Audio-SW auswählen
> kann (oder zb. Skype).
> Das ergibt dann bei mir: "Lautsprecher (Realtek High Defi"
> also sehr verkürzt. Fast jedes aktuelle System hat solche langen Namen.

Registry?

Martin KoWi

unread,
May 7, 2012, 3:07:28 AM5/7/12
to
Am 06.05.2012 23:13, schrieb Thorsten Albers:

> Registry?

WO?

Um Missverständnissen vorzubeugen: natürlich finde ich den Namen meiner
Soundkarte an diversen Stellen in der Registry.

Ich sehe aber keine Stelle an der ich alle Waveouts mit langem Namen
bekomme, analog zu waveOutGetDevCaps (die zugehörige DeviceID brauche
ich ja auch).

Über Core Audio sollte es gehen, aber da komme ich bis jetzt mit VB
nicht ran.

http://stackoverflow.com/questions/5111797/waveoutgetdevcaps-win7-and-long-device-names

gruß, martin.

Thorsten Albers

unread,
May 7, 2012, 5:24:34 AM5/7/12
to
Martin KoWi <martin....@gmx.net> schrieb im Beitrag
<jo7sbh$q0s$1...@dont-email.me>...
> WO?

Ich habe jetzt 'mal kurz gegoogelt. Über folgendes solltest Du
weiterkommen:
"Extended Capabilities from a WDM Audio Driver"

http://msdn.microsoft.com/en-us/library/windows/hardware/ff536382%28v=vs.85%
29.aspx
und die 'übergeordnete' Seite
"WDM Audio Extensions to Legacy Windows Multimedia APIs"

http://msdn.microsoft.com/en-us/library/windows/hardware/ff538919%28v=vs.85%
29.aspx

Thorsten Albers

unread,
May 7, 2012, 5:25:56 AM5/7/12
to
Thorsten Albers <gu...@gmx.de> schrieb im Beitrag
<01cd2c33$38480290$6d01a8c0@k8s8x>...
> Ich habe jetzt 'mal kurz gegoogelt.

Ich vergaß: Die Suchbegriffkombination "waveOutGetDevCaps" "friendly name"
sollte Dich weiterbringen.

Martin KoWi

unread,
May 7, 2012, 6:02:52 AM5/7/12
to
Am 07.05.2012 11:24, schrieb Thorsten Albers:

> Ich habe jetzt 'mal kurz gegoogelt. Über folgendes solltest Du
> weiterkommen:
> "Extended Capabilities from a WDM Audio Driver"
>
> http://msdn.microsoft.com/en-us/library/windows/hardware/ff536382%28v=vs.85%
> 29.aspx

OK, das sieht vielversprechend aus!
das werde ich mal versuchen.

Wenn man es gefunden hat, ist das mit Suchbegriffen immer sonnenklar ;-)

danke, martin.

Schmidt

unread,
May 7, 2012, 9:15:16 AM5/7/12
to
Am 06.05.2012 12:14, schrieb Martin KoWi:

> ich will wissen WIE ich die langen Namen bekomme!

Eine weitere Möglichkeit wäre über das DirectSound-API:


Option Explicit

Declare Function DirectSoundEnumerateW Lib "dsound" _
(ByVal lpDSEnumCallback As Long, ByVal UsrCtx As Long) As Long
Declare Function lstrlenW& Lib "kernel32" (ByVal psSrc&)
Declare Function lstrcpyW& Lib "kernel32" (ByVal psDst&, ByVal psSrc&)

Sub Main()
Dim UsrCtx As Long
UsrCtx = 1234
DirectSoundEnumerateW AddressOf DSEnumCallback, UsrCtx
End Sub


Function DSEnumCallback&(ByVal pGuid As Long, ByVal psDescr As Long, _
ByVal psMod As Long, ByVal UsrCtx As Long)
Debug.Print pGuid, BStrFromPtr(psDescr), BStrFromPtr(psMod), UsrCtx
DSEnumCallback = 1
End Function

Public Function BStrFromPtr(ByVal lpSrc As Long) As String
Dim SLen As Long
If lpSrc = 0 Then Exit Function

SLen = lstrlenW(lpSrc)
If SLen Then
BStrFromPtr = Space$(SLen)
lstrcpyW StrPtr(BStrFromPtr), lpSrc
End If
End Function


Olaf

Martin KoWi

unread,
May 7, 2012, 9:53:11 AM5/7/12
to
Danke Olaf, das ist es!

Jetzt muss ich noch die DSound-Guid der MM-DeviceID zuordnen.
Oder hast du das vielleicht auch fertig ;-)

vg, martin.

Schmidt

unread,
May 7, 2012, 1:57:05 PM5/7/12
to
Am 07.05.2012 15:53, schrieb Martin KoWi:

> Jetzt muss ich noch die DSound-Guid der MM-DeviceID zuordnen.
> Oder hast du das vielleicht auch fertig ;-)

Falls das nur für die Ausgabe von Wav-Schnipseln gedacht ist,
warum dann nicht (bei der Gelegenheit) gleich DirectSound verwenden?

DirectSound-basierte (Wav)Ausgabe funktioniert bei Verwendung
der richtigen TypeLib (ohne irgendwelche Dll-Abhängigkeiten wie
z.B. dx8VB.dll) auch auf Vista, Win7 und Win8.

Olaf

Martin KoWi

unread,
May 8, 2012, 3:17:33 AM5/8/12
to
Am 07.05.2012 19:57, schrieb Schmidt:

> Falls das nur für die Ausgabe von Wav-Schnipseln gedacht ist,
> warum dann nicht (bei der Gelegenheit) gleich DirectSound verwenden?

Du hast wie immer recht - allerdings sind hier mehrere fremde
Komponenten beteiligt!
Da geht noch fast alles über die alten Waveouts (per DevID).
Ich muss das unter einen Hut bringen und eben auch die richtigen Namen
anzeigen.
Deswegen ist mir die richtige Zuordnung wichtig.
Was ich bis jetzt gesehen habe, scheint aber die Enumerierung die
gleiche zusein.
Also wenn ich den ersten ("Primärer Soundtreiber") weglasse, dann stimmt
das soweit.
Damit werde ich vielleicht mal leben können.

Für die Zukunft: welche "richtige" DX-Typelib meinst du?
Falls du ein fertiges Bsp. hast, nehme ich das gerne..

danke & viel grüße,
martin.
0 new messages