|
Question pour les spécialistes des API |
Started by pmingotaud, Apr., 03 2006 6:59 PM - 11 replies |
| |
| | | |
|
| |
Posted on April, 03 2006 - 6:59 PM |
// Bonjour, // Je cherche à récupérer le Handle de la carte Audio de ma machine // dont j'ai besoin pour utiliser les fonctions de la winmm.dll. // N'étant pas un spécialiste des API, je code ...
HWAVEOUT est une structure FIN lphwo est un HWAVEOUT
// On fixe le format de l'échantillonnage. WAVEFORMAT est une structure wFormatTag est un entier nChannels est un entier nSamplesPerSec est un entier wBitsPerSample est un entier nBlockAlign est un entier nAvgBytesPerSec est un entier cbSize est un entier FIN lpformat est un WAVEFORMAT
WAVE_FORMAT_PCM est un entier = 1 // La déjà j'ai un doute. lpformat:wFormatTag = WAVE_FORMAT_PCM lpformat:nChannels = 1 // Mono. lpformat:nSamplesPerSec = 22050 // Fréquence de mixage. lpformat:wBitsPerSample = 8 // 8 bits. lpformat:nAvgBytesPerSec = lpformat:nSamplesPerSec * lpformat:nChannels // Nbre Octets par Seconde. lpformat:nBlockAlign = lpformat:nAvgBytesPerSec / lpformat:nSamplesPerSec // Nbre Données par Sample. lpformat:cbSize = 0
// Ma carte Audio est Full Duplex et il n'y a qu'une carte Audio sur la machine. retourfonction est un entier retourfonction = API("winmm.dll","waveOutOpen",&lphwo,0,&lpformat,0,0,0)
SI retourfonction > 0 ALORS Erreur("Erreur externe non définie : " + retourfonction) // retourfonction = 1 (MMSYSERR_ERROR) au lieu de 0. A cause de WAVE_FORMAT_PCM qui se retrouve à 0.
retourfonction = API("WINMM.DLL","waveInReset",&lphwo) SI retourfonction > 0 ALORS Erreur("Erreur : Handle invalide : " + retourfonction); RETOUR // retourfonction = 5 (MMSYSERR_INVALHANDLE)
// Quelqu'un a t'il une idée sur ce qui cloche dans ce programme ? |
| |
| |
| | | |
|
| | |
| |
Posted on April, 03 2006 - 7:37 PM |
Philippe--
Pour la déclaration des API est des stucture correspondantes, je vous conseille de regarder dans l'utilitaire WDAPI qui est livré avec WinDev (voir WDOutil)
En ce qui concerne la structure WAVEFORMAT il est préferable d'utiliser WAVEFORMATEX
Pour le reste que voulez-vous faire exactement ?
- Ouvrir une fichier wave pour jouer un son ? - Enregistrer un signal audio sous forme de fichier wave ? - Afficher un spectrogramme audio ? |
| |
| |
| | | |
|
| | |
| |
Posted on April, 04 2006 - 10:57 AM |
Bonjour J'essaie d'enregistrer un signal audio sous forme de fichier wave et pour cela j'ai besoin de récupérer le handle de la carte audio avec la fonction waveOutOpen de la dll winmm.dll. Le problème c'est que le 1er paramètre de cette fonction n'est pas vraiment documenté. Dans WDAPI il est écrit "hwi est un HWAVEIN" // Type non retrouve." J'ai donc créé un pointeur phwi vers une structure HWAVEIN dans laquelle j'ai déclaré hwi comme étant un entier, mais la valeur que renvoie la sructure n'est pas le handle du micro. J'ai également essayé HWAVEOUT avec hwo et le pointeur phwo mais impossible de récupérer le handle de la carte audio. Dans les deux cas, les fonctions "waveInReset" et "waveOutReset" renvoient 5 "Handle invalide". Effectivement, ce n'est pas simple. Par ailleurs ma carte est full-Duplex et la fonction "waveInGetDevCapsA" fonctionne bien. Ce qui me laisse à penser que ce sont bien les fonctions "waveInOpen" et "waveOutOpen" qui sont mal paramétrées. Si vous avez une idée, je suis vraiment preneur. Par avance, merci. |
| |
| |
| | | |
|
| | |
| |
Posted on April, 04 2006 - 12:06 PM |
HWAVEOUT est une structure FIN lphwo est un HWAVEOUT
QUE CONTIENT HWAVEOUT ???
"Philippe" <pmingotaud@nerim.net> a écrit dans le message de news: 443137da$1@news.pcsoft.fr...
// Bonjour, // Je cherche à récupérer le Handle de la carte Audio de ma machine // dont j'ai besoin pour utiliser les fonctions de la winmm.dll. // N'étant pas un spécialiste des API, je code ...
HWAVEOUT est une structure FIN lphwo est un HWAVEOUT
// On fixe le format de l'échantillonnage. WAVEFORMAT est une structure wFormatTag est un entier nChannels est un entier nSamplesPerSec est un entier wBitsPerSample est un entier nBlockAlign est un entier nAvgBytesPerSec est un entier cbSize est un entier FIN lpformat est un WAVEFORMAT
WAVE_FORMAT_PCM est un entier = 1 // La déjà j'ai un doute. lpformat:wFormatTag = WAVE_FORMAT_PCM lpformat:nChannels = 1 // Mono. lpformat:nSamplesPerSec = 22050 // Fréquence de mixage. lpformat:wBitsPerSample = 8 // 8 bits. lpformat:nAvgBytesPerSec = lpformat:nSamplesPerSec * lpformat:nChannels // Nbre Octets par Seconde. lpformat:nBlockAlign = lpformat:nAvgBytesPerSec / lpformat:nSamplesPerSec // Nbre Données par Sample. lpformat:cbSize = 0
// Ma carte Audio est Full Duplex et il n'y a qu'une carte Audio sur la machine. retourfonction est un entier retourfonction = API("winmm.dll","waveOutOpen",&lphwo,0,&lpformat,0,0,0)
SI retourfonction > 0 ALORS Erreur("Erreur externe non définie : " + retourfonction) // retourfonction = 1 (MMSYSERR_ERROR) au lieu de 0. A cause de WAVE_FORMAT_PCM qui se retrouve à 0.
retourfonction = API("WINMM.DLL","waveInReset",&lphwo) SI retourfonction > 0 ALORS Erreur("Erreur : Handle invalide : " + retourfonction); RETOUR // retourfonction = 5 (MMSYSERR_INVALHANDLE)
// Quelqu'un a t'il une idée sur ce qui cloche dans ce programme ?
|
| |
| |
| | | |
|
| | |
| |
Posted on April, 04 2006 - 12:54 PM |
// Auteur Patrice Terrier // pterrier@zapsolution.com // www.zapsolution.com // // En Entrée : // hWnd est le handle de la fenêtre. // UseWaveFormat est le type de WAVE a générer. // // En Sortie : // Si nRet alors nRet contient le code de l'erreur. // Si nRet = 0 alors hWi est le WaveIn handle a utiliser. // FUNCTION OpenWaveIn(hWnd is int, UseWaveFormat is int, hWi is int) // Defines for dwFormat field of WAVEINCAPS and WAVEOUTCAPS //WAVE_INVALIDFORMAT = 0x00000000 // invalid format //WAVE_FORMAT_1M08 = 0x00000001 // 11.025 kHz, Mono, 8-bit //WAVE_FORMAT_1S08 = 0x00000002 // 11.025 kHz, Stereo, 8-bit //WAVE_FORMAT_1M16 = 0x00000004 // 11.025 kHz, Mono, 16-bit //WAVE_FORMAT_1S16 = 0x00000008 // 11.025 kHz, Stereo, 16-bit //WAVE_FORMAT_2M08 = 0x00000010 // 22.05 kHz, Mono, 8-bit //WAVE_FORMAT_2S08 = 0x00000020 // 22.05 kHz, Stereo, 8-bit //WAVE_FORMAT_2M16 = 0x00000040 // 22.05 kHz, Mono, 16-bit //WAVE_FORMAT_2S16 = 0x00000080 // 22.05 kHz, Stereo, 16-bit //WAVE_FORMAT_4M08 = 0x00000100 // 44.1 kHz, Mono, 8-bit //WAVE_FORMAT_4S08 = 0x00000200 // 44.1 kHz, Stereo, 8-bit //WAVE_FORMAT_4M16 = 0x00000400 // 44.1 kHz, Mono, 16-bit //WAVE_FORMAT_4S16 = 0x00000800 // 44.1 kHz, Stereo, 16-bit
--- I, nRet, Channel, SamplesPerSec, BitsPerSample are int --- wic is WAVEINCAPS
--- Switch UseWaveFormat --- CASE 1 // WAVE_FORMAT_1M08 Mono 11025 8 bit -------- Channel = 1: SamplesPerSec = 11025: BitsPerSample = 8 --- CASE 2 // WAVE_FORMAT_1S08 Stereo 11025 8 bit -------- Channel = 2: SamplesPerSec = 11025: BitsPerSample = 8 --- CASE 4 // WAVE_FORMAT_1M16 Mono 11025 16 bit -------- Channel = 1: SamplesPerSec = 11025: BitsPerSample = 16 --- CASE 8 // WAVE_FORMAT_1S16 Stereo 11025 16 bit -------- Channel = 2: SamplesPerSec = 11025: BitsPerSample = 16 --- CASE 16 // WAVE_FORMAT_2M08 Mono 22050 8 bit -------- Channel = 1: SamplesPerSec = 22050: BitsPerSample = 8 --- CASE 32 // WAVE_FORMAT_2S08 Stereo 22050 8 bit -------- Channel = 2: SamplesPerSec = 22050: BitsPerSample = 8 -- //CASE 64 // WAVE_FORMAT_2M16 Mono 22050 16 bit --- CASE 128 // WAVE_FORMAT_2S16 Stereo 22050 16 bit -------- Channel = 2: SamplesPerSec = 22050: BitsPerSample = 16 --- CASE 256 // WAVE_FORMAT_4M08 Mono 44100 8 bit -------- Channel = 1: SamplesPerSec = 44100: BitsPerSample = 8 --- CASE 512 // WAVE_FORMAT_4S08 Stereo 44100 8 bit -------- Channel = 2: SamplesPerSec = 44100: BitsPerSample = 8 --- CASE 1024 // WAVE_FORMAT_4M16 Mono 44100 16 bit -------- Channel = 1: SamplesPerSec = 44100: BitsPerSample = 16 --- CASE 2048 // WAVE_FORMAT_4S16 Stereo 44100 16 bit -------- Channel = 2: SamplesPerSec = 44100: BitsPerSample = 16 --- CASE ELSE // WAVE_FORMAT_2M16 Mono 22050 16 bit -------- Channel = 1: SamplesPerSec = 22050: BitsPerSample = 16 END --- nRet = API("WINMM.DLL", "waveInGetNumDevs") --- FOR I = 0 TO Ret - 1 ------- nRet = WaveInGetDevCaps(I, &wic, Dimension(WAVEINCAPS)) ------- IF nRet = MMSYSERR_NOERROR THEN ---------- //IF wic:dwFormats AND WAVE_FORMAT_2M08 THEN ---------- //IF wic:dwFormats AND WAVE_FORMAT_1M16 THEN ---------- IF BinaryAND(wic:dwFormats, UseWaveFormat) THEN ------------- wfx:nChannels = Channel ------------- wfx:nSamplesPerSec = SamplesPerSec ------------- wfx:wFormatTag = WAVE_FORMAT_PCM ------------- wfx:wBitsPerSample = BitsPerSample ------------- wfx:nBlockAlign = wfx:nChannels * wfx:wBitsPerSample / 8 ------------ wfx:nAvgBytesPerSec = wfx:nSamplesPerSec * wfx:nBlockAlign ------------- wfx:cbSize = 0 ------------- nRet = API("WINMM.DLL","waveInOpen", hWi, I, &wfx, hWnd, hWnd, CALLBACK_WINDOW) ------------- IF nRet = MMSYSERR_NOERROR THEN ---------------- Break ------------- END ---------- ELSE ------------- nRet = 22 // "Le périphérique ne reconnaît pas la commande." alias "No suitable device found" ---------- END ------- END --- END
--- RESULT nRet
Désolé pour le formatage du code, mais il est difficile de faire mieux.
Patrice Terrier - Consultant Tel 04.76.98.76.73 pterrier@zapsolution.com www.zapsolution.com |
| |
| |
| | | |
|
| | |
| |
Posted on April, 04 2006 - 1:26 PM |
Note : pour des questions de vitesse il serait préférable d'utiliser une DLL contenant toutes les fonctions dont vous avez besoin, et charger cette DLL une fois au démarrage de l'application en utilisant ChargeDLL (LoadDLL) |
| |
| |
| | | |
|
| | |
| |
Posted on April, 04 2006 - 9:36 PM |
Bonjour et merci beaucoup de m'avoir répondu. Je viens de passer une bonne partie de la journée à essayer de faire tourner waveOutGetDevCaps et waveOutOpen, à partir des programmes que j' ai reçu sur ce site. waveOutGetDevCaps renvoie bien 0, les arguments sont bons sauf wChannels qui renvoie -1 et cela sur deux machines équipées de deux cartes différentes. Du coup waveOutOpen renvoie 11 (paramètre invalide). Après avoir essayé une multitude de combinaisons, j' en arrive à suspecter l'API d'être incompatible avec WinDev. Quelqu'un a t-il déjà réussi à utiliser ces fonctions avec Windev ? Merci par avance pour vos réponses. |
| |
| |
| | | |
|
| | |
| |
Posted on April, 05 2006 - 1:53 AM |
Pour compléter mon précedent message, il semblerait tout simplement que le pointeur pwfx ne puisse pas pointer sur la structure WAVEFORMATEX.
AppelDLL32("WINMM.DLL","waveOutOpen",hwo,0,&pwfx,0,0,0)
Si quelqu'un parvient à utiliser cette fonction avec Windev, merci de me prévenir. Encore merci à tous et plus particulièrement à M. Patrice Terrier pour la qualité de son code et de ses explications. |
| |
| |
| | | |
|
| | |
| |
Posted on April, 05 2006 - 10:43 AM |
Bonjour je ne pense pas qu'il y ai "incompatibilité" entre Windev et cette API... Si le C ou VB le fait alors c'est possible
"Philippe" <pmingotaud@nerim.net> a écrit dans le message de news: 4432de07$1@news.pcsoft.fr...
Pour compléter mon précedent message, il semblerait tout simplement que le pointeur pwfx ne puisse pas pointer sur la structure WAVEFORMATEX.
AppelDLL32("WINMM.DLL","waveOutOpen",hwo,0,&pwfx,0,0,0)
Si quelqu'un parvient à utiliser cette fonction avec Windev, merci de me prévenir. Encore merci à tous et plus particulièrement à M. Patrice Terrier pour la qualité de son code et de ses explications.
|
| |
| |
| | | |
|
| | |
| |
Posted on April, 05 2006 - 10:45 AM |
Un site qui semble bien expliquer http://liocity.free.fr/charger_delphi/tutorial/tutorial28.htm Pour les constantes comme WAVE_MAPPER tu les trouves dans MMReg.h et/ou MMSystem.h Si tu ne les as pas je te les send par mail "Philippe" <pmingotaud@nerim.net> a écrit dans le message de news: 4432de07$1@news.pcsoft.fr...
Pour compléter mon précedent message, il semblerait tout simplement que le pointeur pwfx ne puisse pas pointer sur la structure WAVEFORMATEX.
AppelDLL32("WINMM.DLL","waveOutOpen",hwo,0,&pwfx,0,0,0)
Si quelqu'un parvient à utiliser cette fonction avec Windev, merci de me prévenir. Encore merci à tous et plus particulièrement à M. Patrice Terrier pour la qualité de son code et de ses explications.
|
| |
| |
| | | |
|
| | |
| |
Posted on April, 05 2006 - 12:16 PM |
Voici la bonne structure pour WAVEFORMATEX
WAVEFORMATEX is structure ---- wFormatTag is 2-byte unsigned int // WORD ---- nChannels is 2-byte unsigned int // WORD ---- nSamplesPerSec is 4-byte unsigned int // DWORD ---- nAvgBytesPerSec is 4-byte unsigned int // DWORD ---- nBlockAlign is 2-byte unsigned int // WORD ---- wBitsPerSample is 2-byte unsigned int // WORD ---- cbSize is 2-byte unsigned int // WORD END
Note : waveOutOpen est utilisé pour jouer un fichier WAVE (pas pour enregistrer) "The waveOutOpen function opens the given waveform-audio output device for playback."
Si vous voulez simplement jouer un fichier WAVE, pourquoi n'utilisez-vous pas simplement l'API "PlaySound" |
| |
| |
| | | |
|
| | |
| |
Posted on April, 05 2006 - 1:20 PM |
Bonjour, Je connais "http://liocity.free.fr/charger_delphi/tutorial/tutorial28.htm.", mais pour moi c'est un problème de langage et pas un problème de codage. J'ai déjà lu un problème du même type sur un forum. Si la plupart des API sont utilisables avec Windev, je pense qu'il peut y avoir des exceptions et que "waveOutOpen" en est une. Maintenant, je ne demande qu'à être convaincu du contraire, car pour le moment je suis coincé. Cordialement Philippe |
| |
| |
| | | |
|
| | | | |
| | |
|