pasar varios flags al parámetro de una api de Windows

Tus preguntas. Algoritmos o Grupos de Comandos formando Programas Escripts.
Responder
Jonny
Profesional del Autoit
Mensajes: 1042
Registrado: 30 Jun 2008, 20:08

pasar varios flags al parámetro de una api de Windows

Mensaje por Jonny »

Hola

¡Al fin!...

No se por qué, estos días no podía identificarme en el foro...

Al poner el usuario y la contraseña, decía que había excedido el número de intentos máximos de identificación (o algo así), y ni solucionando el captcha podía loguearme...

Tengo la siguiente duda, para una UDF que estoy haciendo (bastante complicada).

- ¿Como se pasan varios flags a un parámetro de una función de una dll?

Resulta, que a raíz de este post:

http://www.emesn.com/autoitforum/viewto ... f=3&t=2413

he estado investigando y lo que necesitaba eran las apis WaveOut de Windows.

Parece, que estas apis son anteriores a Direct Sound (eso leí en alguna página) entre lo poco que he encontrado explicativo a cerca de estas funciones.

Así pues, aunque no es que haya gran cosa buscando por Google, más que básicamente códigos en VB... di en la msdn con el conjunto de funciones WaveIn y WaveOut y ¿qué mejor que eso para implementarlas? (en el foro inglés hay alguna cosa aunque no en forma de UDF, al menos lo que he encontrado)...

Así, que me puse a implementar las funciones en AutoIt, en forma de UDF (intentando que las funciones queden lo mejor posible), ya que de sonido digital entiendo poco por no decir nada .

- Está la función WaveOutOpen(), que abre un dispositivo de audio para utilizarlo con el resto de funciones WaveOut(). Esta función, entre otros, tiene un argumento que admite flags de apertura. Wave_AllowSync, Wave_Mapper...

La documentación no me deja muy claro si únicamente admite uno, o varios de ellos (entiendo que debe admitir varios si es necesario), y aquí la duda de como pasarle varios flags a este parámetro, porque no veo que en la documentación de la api:

http://msdn.microsoft.com/en-us/library/aa910393.aspx

explique como ha de hacerse.
¿Sumando los valores como en algunas funciones de AutoIt?...

Me han dicho que suele hacerse con operaciones bit a bit, en C++ por ejemplo con el operador |, que deduzco que en AutoIt es la función BitOr() ¿Puede ser?.

También me han dicho, que pueden sumarse los valores (numéricos) de los flags que se quieran pasar, y debería funcionar...
Aunque, Wave_Mapper por ejemplo vale -1 en un .h que utiliza la dll en la que se encuentra esta función (winmm.dll) y eso me han dicho que puede que no funcione sumando valores o haciendo bit a bit...

¿qué os parece?

Si la única forma es hacerlo con BitOr(), veo un problema:

Y es que, al implementar la api en una función de una UDF, donde intento que la función AutoIt sea lo más flexible posible; y por ello he puesto un parámetro que reciba los flags, no se cuantos flags va a recibir la función AutoIt, y por tanto no puedo pasarlos a BitOr()...
¿qué se os ocurre?

A mi de momento nada :).

Acias,

Salu2!
Jonny
Profesional del Autoit
Mensajes: 1042
Registrado: 30 Jun 2008, 20:08

Re: pasar varios flags al parámetro de una api de Windows

Mensaje por Jonny »

Hola

Casi tengo terminada la función WaveOut_Open() de la UDF que estoy haciendo para estas apis que comentaba en el post de arriba.

Os la pongo, para que la veais a ver si os parece qe la estoy haciendo bien...

Seguro que puede mejorarse, sobre todo la documentación; pero no soy un crack con el inglés ni con el sonido digital :P. Por eso, seguramente pueda traducirse mejor, o hayan cosas que no estén del todo bien traducidas y/o redactadas (SORRY) :).

Código: Seleccionar todo

Global Const $_Err_Dll=-1
Global Const $_MMSysErr_Base=0
Global Const $_WavErr_Base=32
Global Const $_MMSysErr_NoError=0
Global Const $_MMSysErr_InValHandle=($_MMSysErr_Base+5)
Global Const $_MMSysErr_NoDriver=($_MMSysErr_Base+6)
Global Const $_MMSysErr_NoMem=($_MMSysErr_Base+7)
Global Const $_WavErr_StillPlaying=($_WavErr_Base+1)
Global Const $_MMSysErr_BadDeviceID=($_MMSysErr_Base+2)
Global Const $_MMSysErr_NotSupported=($_MMSysErr_Base+8)
Global Const $_Wave_Format_1M08=1
Global Const $_Wave_Format_1M16=4
Global Const $_Wave_Format_1S08=2
Global Const $_Wave_Format_1S16=8
Global Const $_Wave_Format_2M08=16
Global Const $_Wave_Format_2M16=64
Global Const $_Wave_Format_2S08=32
Global Const $_Wave_Format_2S16=128
Global Const $_Wave_Format_4M08=256
Global $_Wave_Format_4M16=1024
Global Const $_Wave_Format_4S08=512
Global Const $_Wave_Format_4S16=2048
Global Const $_WaveCaps_LRVolume=8
Global Const $_WaveCaps_Pitch=1
Global $_WaveCaps_PlayBackRate=2
Global Const $_WaveCaps_Volume=4
Global Const $_WaveCaps_SampleAccurate=32
Global Const $_Wave_Format_Query=1
Global Const $_Wave_Mapper=-1
Global Const $_Wave_AllowSync=2
Global Const $_Wave_AllowSyncNull=0
Global Const $_CallBack_Event=0x50000
Global Const $_CallBack_Function=0x30000
Global Const $_CallBack_Null=0
Global Const $_CallBack_Window=0x10000
Global Const $_Wave_Format_Direct=8
Global Const $_WAVE_MAPPED=4
Global Const $_WavErr_BadFormat=($_WavErr_Base+0)
Global Const $_WavErr_Sync=($_WavErr_Base+3)
Global Const $_Wave_Format_PCM=0x01

Global Const $_Wave_Format_Unknown=0x0000 ;Microsoft Corporation
Global Const $_Wave_Format_AdPCM=0x0002 ;Microsoft Corporation
Global Const $_Wave_Format_Ieee_Float=0x0003 ;Microsoft Corporation
Global Const $_Wave_Format_VSElp=0x0004 ;Compaq Computer Corp.
Global Const $_Wave_Format_IBM_CVSD=0x0005 ;IBM Corporation
Global Const $_Wave_Format_AlAw=0x0006 ;Microsoft Corporation
Global Const $_Wave_Format_MuLaw=0x0007 ;Microsoft Corporation
Global Const $_Wave_Format_DTS=0x0008 ;Microsoft Corporation
Global Const $_Wave_Format_DRM=0x0009 ;Microsoft Corporation
Global Const $_Wave_Format_WmaVoice9=0x000A ;Microsoft Corporation
Global Const $_Wave_Format_WmaVoice10=0x000B ;Microsoft Corporation
Global Const $_Wave_Format_Oki_AdPCM=0x0010 ;OKI
Global Const $_Wave_Format_Dvi_AdPCM=0x0011 ;Intel Corporation
Global Const $_Wave_Format_Ima_AdPCM=($_Wave_Format_Dvi_AdPCM) ;Intel Corporation
Global Const $_Wave_Format_MediaSpace_AdPCM=0x0012 ;Videologic
Global Const $_Wave_Format_Sierra_AdPCM=0x0013 ;Sierra Semiconductor Corp
Global Const $_Wave_Format_G723_AdPCM=0x0014 ;Antex Electronics Corporation
Global Const $_Wave_Format_Digistd=0x0015 ;DSP Solutions, Inc.
Global Const $_Wave_Format_DigiFix=0x0016 ;DSP Solutions, Inc.
Global Const $_Wave_Format_Dialogic_Oki_AdPCM=0x0017 ;Dialogic Corporation
Global Const $_Wave_Format_MediaVision_AdPCM=0x0018 ;Media Vision, Inc.
Global Const $_Wave_Format_Cu_Codec=0x0019 ;Hewlett-Packard Company
Global Const $_Wave_Format_Yamaha_AdPCM=0x0020 ;Yamaha Corporation of America
Global Const $_Wave_Format_Sonarc=0x0021 ;Speech Compression
Global Const $_Wave_Format_DSPGroupS_TrueSpeech=0x0022 ;DSP Group, Inc
Global Const $_Wave_Format_EchoSc1=0x0023 ;Echo Speech Corporation
Global Const $_Wave_Format_AudioFile_Af36=0x0024 ;Virtual Music, Inc.
Global Const $_Wave_Format_Aptx=0x0025 ;Audio Processing Technology
Global Const $_Wave_Format_AudioFile_Af10=0x0026 ;Virtual Music, Inc.
Global Const $_Wave_Format_Prosody_1612=0x0027 ;Aculab plc
Global Const $_Wave_Format_Lrc=0x0028 ;Merging Technologies S.A.
Global Const $_Wave_Format_Dolby_Ac2=0x0030 ;Dolby Laboratories
Global Const $_Wave_Format_Gsm610=0x0031 ;Microsoft Corporation
Global Const $_Wave_Format_MsnAudio=0x0032 ;Microsoft Corporation
Global Const $_Wave_Format_Antex_AdPCME=0x0033 ;Antex Electronics Corporation
Global Const $_Wave_Format_Control_Res_VqlPC=0x0034 ;Control Resources Limited
Global Const $_Wave_Format_DigiReal=0x0035 ;DSP Solutions, Inc.
Global Const $_Wave_Format_DigiAdPCM=0x0036 ;DSP Solutions, Inc.
Global Const $_Wave_Format_Control_Res_Cr10=0x0037 ;Control Resources Limited
Global Const $_Wave_Format_Nms_VbxADPCM=0x0038 ;Natural MicroSystems
Global Const $_Wave_Format_Cs_ImaAdPCM=0x0039 ;Crystal Semiconductor IMA ADPCM
Global Const $_Wave_Format_EchoSc3=0x003A ;Echo Speech Corporation
Global Const $_Wave_Format_RockWell_AdPCM=0x003B ;Rockwell International
Global Const $_Wave_Format_RockWell_DigiTalk=0x003C ;Rockwell International
Global Const $_Wave_Format_Xebec=0x003D ;Xebec Multimedia Solutions Limited
Global Const $_Wave_Format_G721_AdPCM=0x0040 ;Antex Electronics Corporation
Global Const $_Wave_Format_G728_Celp=0x0041 ;Antex Electronics Corporation
Global Const $_Wave_Format_Msg723=0x0042 ;Microsoft Corporation
Global Const $_Wave_Format_Mpeg=0x0050 ;Microsoft Corporation
Global Const $_Wave_Format_Rt24=0x0052 ;InSoft, Inc.
Global Const $_Wave_Format_Pac=0x0053 ;InSoft, Inc.
Global Const $_Wave_Format_MpegLayer3=0x0055 ;ISO/MPEG Layer3 Format Tag
Global Const $_Wave_Format_Lucent_G723=0x0059 ;Lucent Technologies
Global Const $_Wave_Format_Cirrus=0x0060 ;Cirrus Logic
Global Const $_Wave_Format_EsPCM=0x0061 ;ESS Technology
Global Const $_Wave_Format_VoxWare=0x0062 ;Voxware Inc
Global Const $_Wave_Format_Canopus_Atrac=0x0063 ;Canopus, co., Ltd.
Global Const $_Wave_Format_G726_AdPCM=0x0064 ;APICOM
Global Const $_Wave_Format_G722_AdPCM=0x0065 ;APICOM
Global Const $_Wave_Format_DsAt_Display=0x0067 ;Microsoft Corporation
Global Const $_Wave_Format_VoxWare_Byte_Aligned=0x0069 ;Voxware Inc
Global Const $_Wave_Format_VoxWare_Ac8=0x0070 ;Voxware Inc
Global Const $_Wave_Format_VoxWare_Ac10=0x0071 ;Voxware Inc
Global Const $_Wave_Format_VoxWare_Ac16=0x0072 ;Voxware Inc
Global Const $_Wave_Format_VoxWare_Ac20=0x0073 ;Voxware Inc
Global Const $_Wave_Format_VoxWare_Rt24=0x0074 ;Voxware Inc
Global Const $_Wave_Format_VoxWare_Rt29=0x0075 ;Voxware Inc
Global Const $_Wave_Format_VoxWare_Rt29Hw=0x0076 ;Voxware Inc
Global Const $_Wave_Format_VoxWare_Vr12=0x0077 ;Voxware Inc
Global Const $_Wave_Format_VoxWare_Vr18=0x0078 ;Voxware Inc
Global Const $_Wave_Format_VoxWare_Tq40=0x0079 ;Voxware Inc
Global Const $_Wave_Format_SoftSound=0x0080 ;Softsound, Ltd.
Global Const $_Wave_Format_VoxWare_Tq60=0x0081 ;Voxware Inc
Global Const $_Wave_Format_Msrt24=0x0082 ;Microsoft Corporation
Global Const $_Wave_Format_G729A=0x0083 ;AT&T Labs, Inc.
Global Const $_Wave_Format_Mvi_Mvi2=0x0084 ;Motion Pixels
Global Const $_Wave_Format_Df_G726=0x0085 ;DataFusion Systems (Pty) (Ltd)
Global Const $_Wave_Format_Df_Gsm610=0x0086 ;DataFusion Systems (Pty) (Ltd)
Global Const $_Wave_Format_IsiAudio=0x0088 ;Iterated Systems, Inc.
Global Const $_Wave_Format_OnlyVe=0x0089 ;OnLive! Technologies, Inc.
Global Const $_Wave_Format_Sbc24=0x0091 ;Siemens Business Communications Sys
Global Const $_Wave_Format_Dolby_Ac3_Spdif=0x0092 ;Sonic Foundry
Global Const $_Wave_Format_MediaSonic_G723=0x0093 ;MediaSonic
Global Const $_Wave_Format_Prosody_8KBPS=0x0094 ;Aculab plc
Global Const $_Wave_Format_Zyxel_AdPCM=0x0097 ;ZyXEL Communications, Inc.
Global Const $_Wave_Format_Philips_Lpcbb=0x0098 ;Philips Speech Processing
Global Const $_Wave_Format_Packed=0x0099 ;Studer Professional Audio AG
Global Const $_Wave_Format_Malden_PhonyTalk=0x00A0 ;Malden Electronics Ltd.
Global Const $_Wave_Format_Rhetorex_AdPCM=0x0100 ;Rhetorex Inc.
Global Const $_Wave_Format_Irat=0x0101 ;BeCubed Software Inc.
Global Const $_Wave_Format_Vivo_G723=0x0111 ;Vivo Software
Global Const $_Wave_Format_Vivo_Siren=0x0112 ;Vivo Software
Global Const $_Wave_Format_Digital_G723=0x0123 ;Digital Equipment Corporation
Global Const $_Wave_Format_Sanyo_Ld_AdPCM=0x0125 ;Sanyo Electric Co., Ltd.
Global Const $_Wave_Format_Siprolab_Aceplnet=0x0130 ;Sipro Lab Telecom Inc.
Global Const $_Wave_Format_Siprolab_Acelp4800=0x0131 ;Sipro Lab Telecom Inc.
Global Const $_Wave_Format_Ssiprolab_Acelp8V3=0x0132 ;Sipro Lab Telecom Inc.
Global Const $_Wave_Format_Siprolab_G729=0x0133 ;Sipro Lab Telecom Inc.
Global Const $_Wave_Format_Siprolab_G729A=0x0134 ;Sipro Lab Telecom Inc.
Global Const $_Wave_Format_Siprolab_Kelvin=0x0135 ;Sipro Lab Telecom Inc.
Global Const $_Wave_Format_G726AdPCM=0x0140 ;Dictaphone Corporation
Global Const $_Wave_Format_Qualcomm_PPureVoice=0x0150 ;Qualcomm, Inc.
Global Const $_Wave_Format_Qualcomm_HalfRate=0x0151 ;Qualcomm, Inc.
Global Const $_Wave_Format_TubGsm=0x0155 ;Ring Zero Systems, Inc.
Global Const $_Wave_Format_MsAudio1=0x0160 ;Microsoft Corporation
Global Const $_Wave_Format_WmAUDIO2=0x0161 ;Microsoft Corporation
Global Const $_Wave_Format_WmAudio3=0x0162 ;Microsoft Corporation
Global Const $_Wave_Format_WmAudio_LossLess=0x0163 ;Microsoft Corporation
Global Const $_Wave_Format_WmAspdif=0x0164 ;Microsoft Corporation
Global Const $_Wave_Format_Unisys_Nap_AdPCM=0x0170 ;Unisys Corp.
Global Const $_Wave_Format_Unisys_Nap_UlAw=0x0171 ;Unisys Corp.
Global Const $_Wave_Format_Unisys_Nap_AlAw=0x0172 ;Unisys Corp.
Global Const $_Wave_Format_Unisys_Nap_16K=0x0173 ;Unisys Corp.
Global Const $_Wave_Format_Creative_AdPCM=0x0200 ;Creative Labs, Inc
Global Const $_Wave_Format_Creative_FastSpeech8=0x0202 ;Creative Labs, Inc
Global Const $_Wave_Format_Creative_FastSpeech10=0x0203 ;Creative Labs, Inc
Global Const $_Wave_Format_Uher_AdPCM=0x0210 ;UHER informatic GmbH
Global Const $_Wave_Format_QuarterDeck=0x0220 ;Quarterdeck Corporation
Global Const $_Wave_Format_ILink_Vc=0x0230 ;I-link Worldwide
Global Const $_Wave_Format_Raw_Sport=0x0240 ;Aureal Semiconductor
Global Const $_Wave_Format_Esst_Ac3=0x0241 ;ESS Technology, Inc.
Global Const $_Wave_Format_Generic_Passthru=0x0249
Global Const $_Wave_Format_Ipi_Hsx=0x0250 ;Interactive Products, Inc.
Global Const $_Wave_Format_Ipi_Rpelp=0x0251 ;Interactive Products, Inc.
Global Const $_Wave_Format_Cs2=0x0260 ;Consistent Software
Global Const $_Wave_Format_Sony_Scx=0x0270 ;Sony Corp.
Global Const $_Wave_Format_Fm_Twns_Snd=0x0300 ;Fujitsu Corp.
Global Const $_Wave_Format_Btv_Digital=0x0400 ;Brooktree Corporation
Global Const $_Wave_Format_QDesign_Music=0x0450 ;QDesign Corporation
Global Const $_Wave_Format_Vme_VmPCM=0x0680 ;AT&T Labs, Inc.
Global Const $_Wave_Format_Tpc=0x0681 ;AT&T Labs, Inc.
Global Const $_Wave_Format_OliGsm=0x1000 ;Ing C. Olivetti & C., S.p.A.
Global Const $_Wave_Format_OliAdPCM=0x1001 ;Ing C. Olivetti & C., S.p.A.
Global Const $_Wave_Format_OliCelp=0x1002 ;Ing C. Olivetti & C., S.p.A.
Global Const $_Wave_Format_OliSbc=0x1003 ;Ing C. Olivetti & C., S.p.A.
Global Const $_Wave_Format_OliOpr=0x1004 ;Ing C. Olivetti & C., S.p.A.
Global Const $_Wave_Format_Lh_Codec=0x1100 ;Lernout & Hauspie
Global Const $_Wave_Format_NoRris=0x1400 ;Norris Communications, Inc.
Global Const $_Wave_Format_SoundSpace_MusicOmpress=0x1500 ;AT&T Labs, Inc.
Global Const $_Wave_Format_Mpeg_Adts_Aac=0x1600 ;Microsoft Corporation
Global Const $_Wave_Format_Mpeg_Raw_Aac=0x1601 ;Microsoft Corporation
Global Const $_Wave_Format_Nokia_Mpeg_Adts_Aac=0x1608 ;Microsoft Corporation
Global Const $_Wave_Format_Nokia_Mpeg_Raw_Aac=0x1609 ;Microsoft Corporation
Global Const $_Wave_Format_Vodafone_Mpeg_Adts_Aac=0x160A ;Microsoft Corporation
Global Const $_Wave_Format_Vodafone_Mpeg_Raw_Aac=0x160B ;Microsoft Corporation
Global Const $_Wave_Format_Dvm=0x2000 ;FAST Multimedia AG

Func WaveOut_Open($IDDevice=$_Wave_Mapper, $FormatDevice=$_Wave_Format_PCM, $CallBackFuncName=$_CallBack_Null, $FlagDevice=$_Wave_allowSync, $ArgnChannels=2, $ArgnSamplesPerSec=22050, $ArgwBitsPerSample=16)
 #CS

  ----------

  Descripción: Abre un dispositivo de salida de audio.
  Argumentos:
   -$IDDevice:
    Identificador del dispositivo de salida de audio a abrir.
     Pueden utilizarse una de las siguientes banderas en vez del identificador del dispositivo:
      -$_Wave_Mapper: Se abre un dispositivo capaz de reproducir el formato de audio indicado (Valor por defecto).
    Si sólo hay un dispositivo de salida de audio, el identificador de este será 0.
   -$FormatDevice:
    Formato de audio a utilizar en el dispositivo de salida de audio (Por defecto el dispositivo se abre para "wave").
    (Ver la lista de constantes relativas a los formatos de audio, para ver la lista completa de formatos disponibles).
   -$CallBackFuncName:
    -Nombre de la función callback a la que el dispositivo de salida de audio llamará durante el procesamiento del audio.
     Si no se desea registrar ninguna función callback este parámetro debe valer $_CallBack_Null (valor por defecto).
     Las funciones callback que invoca esta función, reciben los siguientes mensajes de procesamiento del audio:
      -"WOM_OPEN".
      -"WOM_CLOSE".
      -"WOM_DONE".
     Las llamadas a las funciones callback se realizan cuando uno o más buffers se devuelven a la aplicación cliente.
   -$FlagDevice:
    Flags para la apertura del dispositivo de salida de audio:
     -$_Wave_AllowSync: Permite abrir otros dispositivos de salida de audio simultáneamente, mientras el dispositivo indicado esté abierto.
     -$_Wave_AllowSyncNull: No permite que se abran otros dispositivos de salida de audio mientras el dispositivo indicado esté abierto.
     -$_Wave_Format_Direct: "ACM driver" no realiza conversiones entre formatos de audio.
     -$_Wave_Format_Query: Comprueba si el dispositivo de salida de audio soporta el formato indicado, pero no lo abre.
    Si se requiere especificar más de un flag, estos deben indicarse mediante una operación BitAnd, por ejemplo así:
     BitAnd($_Wave_AllowSync, $_Wave_Format_Query)
    Con tantos flags como deseen pasarse a la función.
   -$ArgnChannels:
    Canales del formato de audio que se utilizará en el dispositivo de salida de audio indicado:
     -1=Mono.
     -2=Estéreo (valor por defecto).
   -$ArgnSamplesPerSec:
    Samples por segundo del formato de audio que se utilizará en el dispositivo de salida de audio indicado.
    Si se especifica $_Wave_Format_PCM en $FormatDevice, serán válidos los siguientes valores:
     -8.0 kHz.
     -11.025 kHz.
     -22.05 kHz (valor por defecto).
     -44.1 kHz.
    Para otros formatos de audio, consultar las especificaciones del fabricante, para ver los posibles valores de este parámetro.
   -$ArgwBitsPerSample:
    Bits por muestra de audio.
    Si se especifica $_Wave_Format_PCM en $FormatDevice, serán válidos los siguientes valores:
     -8.
     -16 (valor por defecto).
  Valor(es) de retorno:
   -$_Err_Dll: Ocurrió un error al abrir el dispositivo indicado.
   -$_MMSysErr_InValHandle: El handle del dispositivo de salida de audio indicado es incorrecto.
   -$_MMSysErr_BadDeviceID: El identificador del dispositivo de salida de audio indicado está fuera de rango.
   -$_MMSysErr_NoDriver: No hay dispositivos de salida de audio en el equipo.
   -$_MMSysErr_NoMem: Imposible asignar memoria.
   -$_WavErr_BadFormat: El dispositivo de salida de audio indicado no soporta el formato de audio especificado.
   -$_WavErr_Sync: El dispositivo de salida de audio es síncrono, pero WaveOut_Open() fue llamada sin utilizar el flag $_Wave_AllowSync.
   -<>$_Err_Dll/$_MMSysErr_InValHandle/$_MMSysErr_BadDeviceID/$_MMSysErr_NoDriver/$_MMSysErr_NoMem/$_WavErr_BadFormat/$_WavErr_Sync: Handle del dispositivo de salida de audio abierto.

  ----------

 #CE
  Local $BuffAudioCaps, $OpDevice, $SetAudioFormat1
  Local $SetAudioFormat2, $SetAudioFormat3, $SetAudioFormat4
  Local $SetAudioFormat5, $SetAudioFormat6, $SetAudioFormat7
  Local $FuncCallBackDevice, $FuncCallBackPTR, $CallBackType
  Local $BuffHandDevice, $ValFlagDevice
   If ($IDDevice=="" Or $FormatDevice=="" Or $CallBackFuncName=="" Or $FlagDevice=="" _
    Or $ArgnChannels=="" Or $ArgnSamplesPerSec=="" Or $ArgwBitsPerSample=="") Then Return $_Err_Dll
   $BuffAudioCaps=DllStructCreate("ushort wFormatTag;ushort nChannels;dword nSamplesPerSec;dword nAvgBytesPerSec;ushort nBlockAlign;ushort wBitsPerSample;ushort cbSize")
   $BuffHandDevice=DllStructCreate("long")
   $SetAudioFormat1=DllStructSetData($BuffAudioCaps, "wFormatTag", $FormatDevice)
   $SetAudioFormat2=DllStructSetData($BuffAudioCaps, "nChannels", $ArgnChannels)
   $SetAudioFormat3=DllStructSetData($BuffAudioCaps, "nSamplesPerSec", $ArgnSamplesPerSec)
   $SetAudioFormat4=DllStructSetData($BuffAudioCaps, "wBitsPerSample", $ArgwBitsPerSample)
   $SetAudioFormat5=DllStructSetData($BuffAudioCaps, "nBlockAlign", ($ArgwBitsPerSample/8)*$ArgnChannels)
   $SetAudioFormat6=DllStructSetData($BuffAudioCaps, "nAvgBytesPerSec", DllStructGetData($BuffAudioCaps, "nBlockAlign")*$ArgnSamplesPerSec)
   $SetAudioFormat7=DllStructSetData($BuffAudioCaps, "cbSize", 0)
   If ($BuffAudioCaps==0 Or $BuffHandDevice==0 Or $SetAudioFormat1==0 Or $SetAudioFormat2==0 Or $SetAudioFormat3==0 _
    Or $SetAudioFormat4==0 Or $SetAudioFormat5==0 Or $SetAudioFormat6==0 Or ($SetAudioFormat7==0 And @Error<>0)) Then Return $_Err_Dll
   If $IDDevice==$_Wave_Mapper Then
    $ValFlagDevice=BitAnd($FlagDevice, $_Wave_Mapper)
   EndIf
   $OpDevice=DllCall($WinmmDLL, "int", "waveOutOpen", "ptr", DllStructGetPtr($BuffHandDevice), "uint", $IdDevice, "ptr", DllStructGetPtr($BuffAudioCaps), "ulong", 0, "ulong", 0, "dword", $ValFlagDevice)
   If @Error<>0 Then Return $_Err_Dll
   If $OpDevice[0]<>0 Then
    Return $OpDevice[0]
   Else
    Return DllStructGetData($BuffHandDevice, 1)
   EndIf
EndFunc
Ese montón de constantes, son de un .h que utiliza la librería (habrán más cuando esté toda la UDF terminada). las he puesto para que sea más fácil entender el significado de los valores y de recordarlas; además, de para tenerlo todo a mano a la hora de usar las funciones, y no tener que romperse los cuernos buscando en archivos .h, en la msdn o en Google, porque la documentación de las funciones habla siempre de las constantes en vez de los valores reales.

Digo que está casi terminada, porque faltaría implementar la opción de registrar un callback si se desea, pero aún no lo he implementado, pues no se qué parámetros ha de tener la función callback (a ver si lo encuentro por algún sitio).

Por lo demás, yo creo que está todo hecho. Devuelve aparentemente el handle del dispositivo abierto, tanto si se especifica un id de dispositivo como si se deja que sea la propia función quien busque el más adecuado para reproducir el formato de audio indicado.
Lo que ocurre, es que no se el porqué, pero a veces, al cerrar el script con el que invoco a esta función, peta el autoit y sale eso de los informes de errores. Es por la llamada a WaveoutOpen, pero no se por qué. Aunque debe ser cosa del tipo de dato de algún argumento, he probado de todas las formas posibles y nada... Peta cuando le da la gana. A ver si alguien sabe ver cual es el problema...

Ale, que espero opiniones, sugerencias.... :P.

Salu2!
Responder