Red de conocimiento informático - Problemas con los teléfonos móviles - VB.NET hace una pregunta, cree un programa de recordatorio de tono de llamada programado, cómo hacer referencia al tono de llamada en el programa, escriba el código, ¿agrega el código en el temporizador?

VB.NET hace una pregunta, cree un programa de recordatorio de tono de llamada programado, cómo hacer referencia al tono de llamada en el programa, escriba el código, ¿agrega el código en el temporizador?

Simplemente coloque las siguientes tres líneas de código en el temporizador. La clave es el proceso de reproducción.

deal wav . mcisendstring " open " amp; sA amp "alias wav", sB, Len(sB), 0

DealWav.mciSendString "reproducir wav ", sB, Len( sB), 0

DealWav.mciSendString "close wav ", sB, Len(sB), 0

Enviarle el módulo de transacción

Dim WAVBuffer() Como Bytes

Dim DataLenOut es largo

Dim Datapos1 es tan largo

Dim Datapos2 es largo

Dim ChunkLen tan largo

Dim factpos As Long

PCMWAVEFORMAT tipo 'definición de formato PCM estándar.

WFormatTag es un identificador de formato entero, que distingue diferentes formatos, y PCM es 1.

Nchannelas entero 'Número de canales de audio, mono es 1, estéreo es 2.

nsampleseclong 'El número de muestras por segundo, es decir, la frecuencia de muestreo.

Las frecuencias de muestreo estándar son 8.000 kHz, 11.025 kHz,

22.050 kHz, 44.100 kHz, etc.

navgbytes es el número de bytes por segundo de long ', que es la velocidad de datos.

Velocidad de datos = número de canales × frecuencia de muestreo × tamaño de muestreo/8

NBlockAlign As Integer 'Alineación de bloque, que es la unidad más pequeña de datos de forma de onda.

Alineación de bloques = número de canales × tamaño de muestreo/8

El número de bits por muestra, es decir, el tamaño de la muestra.

Hay dos tamaños de muestra: 8 bits y 16 bits.

Tipo de fin

Encabezado de onda especializado

stri riff como cadena * 4 ' 00 H4 char símbolo "riff"

LngFileLen As Long ' 04H 4 long int longitud del archivo

Strwave como cadena * 4' 08H4 símbolo "wave" de caracteres

StrFmt como cadena * 4' 0CH 4 caracteres logotipo "fmt"

Byte de conversión Lngttmpas long' 10h4 (indefinido)

El formato int es la categoría de formato 14h2int de entero (10H son datos de sonido PCM).

IntChan es un número entero de canal '16H 2 int, el canal mono es 1 y el canal dual es 2.

IntFreq As Long' 18H Frecuencia de muestreo de 2 int (número de muestras por segundo), que indica la velocidad de reproducción de cada canal.

lngsendspeed as long ' 1 La velocidad de transmisión de datos de audio de forma de onda CH4 long int es el número de canales × bits de datos por segundo × bits de datos por muestra / 8. El software de reproducción puede utilizar este valor para estimar el tamaño del búfer.

El número de ajuste de intBlock es el bloque de datos int 20H 2 de Integer (calculado en bytes), y su valor es el número de canales × el valor del bit de datos de cada muestra/8.

El software de reproducción necesita usar este valor para procesar varios bytes de datos a la vez, de modo que su valor pueda usarse para el ajuste del búfer.

IntBit As Integer' 22H 2El número de bits de datos por muestra indica el número de bits de datos por muestra en cada canal. Si hay varios canales, el tamaño de la muestra es el mismo para cada canal.

StrData As String * 4' 24H Etiqueta de datos de 4 caracteres "Data"

Datos de voz largos con una duración de 28 horas.

Tipo de finalización

Función de declaración pública sndPlaySound Lib "winmm" alias "sndPlaySoundA" (ByVal lpszSoundName es String, ByVal uFlags es Long) es Long

Movimiento de bandera

Const pública SND_SYNC = amp Hipótesis nula

Const pública SND_ASYNC = ampH1

Construcción pública SND_NODEFAULT = amp Deuterio

Const pública SND _ MEMORIA = ampH4

Const pública SND _ LOOP = ampH8

Const pública SND _ NOSTOP = ampH10

Función de declaración privada PlaySound Lib" winmm . dll" alias " PlaySoundA" (ByVal lpszName es String, ByVal hModule es Long, ByVal dwFlags es Long) es Long

Función de declaración pública mciSendString Lib "winmm dll" alias "mciSendStringA" (ByVal lpstrCommand es String, ByVal lpstrReturnString es. String, ByVal uReturnLength es Long, ByVal hwndCallback es Long) es Long

La función de declaración pública MCI ejecuta Lib " winmm . dll "(ByVal lpstrCommand As String) es Long

Declara la función PlaySound Lib "winmm . dll" alias "PlaySoundA" (ByVal lpszName es String, ByVal hModule es Long, ByVal dwFlags es Long) como Long

public Declare Sub RtlMoveMemory Lib "kernel 32" (lpv dest como cualquiera , lpvSource como cualquiera, ByVal cbCopy As Long)

Subcomando privado 1_Click()

Para evitar que dos archivos wav seleccionados aleatoriamente tengan formatos diferentes, simplemente repito el mismo archivo dos veces.

enlace wav "C:\WINNT\Media\ringout.wav", "C:\WINNT\Media\ringout.wav", "f:\temp.wav"

Conector final

Función privada getWavHead (strFileName en forma de cadena) como encabezado de onda

Obtener encabezado de archivo

Dim iFreeFile

iFreeFile = FreeFile ()

Ir al identificador de errores en caso de error

Atenuar mi cabeza hasta convertirla en una cabeza de onda

Abrir strFileName del archivo binario como #iFreeFile

p>

Obtener #iFreeFile,,MyHead

Cerrar #iFreeFile

getWavHead = MyHead

Identificador de error:

Finalizar función

p>

enlace de función pública wav(str filename 1 es una cadena, strFileName2 es una cadena, strOutFile es una cadena) es un valor booleano

Atenúa la cabeza hacia adelante hasta convertirla en una cabeza de onda

p>

Oscurecer el encabezado como el encabezado de onda

El encabezado del nuevo archivo.

Dim Data1() son bytes

Dim Data2() son bytes

Dim es tan largo como yo

LinkWav = False

Obtener el título

head first = getWavHead(strfilename 1)

head next = getWavHead(strfilename 2)

Comparación de encabezados de archivos

Aquí es necesario comparar los dos cabezales. Si la frecuencia de muestreo, el número de canales, etc. son inconsistentes, no se puede establecer la conexión.

Me da pereza hacer esta comprobación. Si quieres aplicarlo en la práctica, debes completar este código.

Crear un nuevo título

HeadNew = headFirst 'Copiar un encabezado primero.

head new .lngfilelen = head first . lngdatalenth head next .lngdatalenth 37

La longitud del archivo es igual a la longitud de los datos de los dos archivos más la longitud del encabezado del archivo. ¿Por qué 37? ¡Yo tampoco lo entiendo! La longitud total del encabezado es 44, sin los 4 bytes y los indicadores de riff de 4 bytes, la longitud del archivo debe ser 36 wow. Pero abres un archivo wav y restas el campo de longitud de datos del campo de longitud del archivo, y es 37. Lo pensé durante mucho tiempo y no pude entenderlo. ¡Finalmente cedí y escribí 37 aquí! (

head new . lngdatalenth = head first . lngdatalenth head next . lngdatalenth

La longitud del segmento de datos es la suma de los datos en los dos archivos.

Lo siguiente son operaciones de archivos. Para acelerar la codificación y reducir el daño a las células cerebrales, el siguiente código es muy ineficiente y usted mismo puede optimizarlo.

Sería terrible si utilizara directamente el siguiente código para recomendarle que no lea archivos que sean demasiado grandes ~ ~

¡Lea datos de dos archivos! !

ReDim datos 1 (cabeza primero . lngdatalenth-1)

abre strfilename 1 para aleatorio como # 1 Len = 1

Abre strFileName1 para archivo binario como # 1

Para i = 0 a headFirst.lngDataLenth - 1

Obtenga #1, 45 i, Data1(i)

Luego

Cerrar #1

ReDim datos 2 (encabezar siguiente . lngdatalenth-1)

abrir strfilename 2 para aleatorio como # 1 Len = 1

Abrir strfilename 2 Para binario como # 1 ' Len = 1

Para i = 0 a headNext.lngDataLenth - 1

Obtenga #1, 45 i, Data2(i)

Luego

Cierre #1

Comience a escribir datos

Abra strOutFile para aleatorio como #1 Len = 1

Abra con #1 strOutFile para archivos binarios

' Put #1, headNew 'Escribe el encabezado del archivo en el archivo.

Cerrar #1

Abrir strOutFile para aleatorio como #1 Len = 1

Para i = 0 al límite inferior (datos 1)

"Put #1, 45 i, Data1(i)" escribe el primer registro en el archivo.

Luego

Para i = 0 al límite inferior (Datos2)

Coloque #1, Datos2(i)' escribe el primer registro en el archivo.

Entonces

' Cerrar #1 'Cierra el archivo.

Finalizar función

Fusionar dos archivos de sonido WAV.

Función pública WavMerge como variable (Wave1() como byte, Wave2() como byte)

Dim xx As Long

Dim Y$$

1. Determine el punto de partida del bloque de datos (diferentes archivos WAV pueden ser diferentes).

Y $ lt gt"data"

y $ = Chr(onda 1(xx)) amp; chr(onda 1(xx 1)) amp; xx 2)) amp; Chr (onda 1 (xx 3))

xx = xx 1

Si xx gt entonces 1000

MsgBox "Formato desconocido"

Salir de la función

Terminará si...

Anillo

Datapos1 = (xx - 1) 8

xx = 0

Y$ = " "

Y $ lt gt"data"

y $ = Chr(onda 2(xx)) amp ;chr(onda 2(xx 1)) amp;chr(onda 2(xx 2)) amp;Chr(onda 2(xx 3))

xx = xx 1

Si xx gt entonces 1000

MsgBox "Formato desconocido"

Salir de la función

Si... terminará

Bucle

Datapos2 = (xx - 1) 8

xx = 0

Y$ = " "

2. Wave1 Contiene bloques de hechos opcionales.

factpos = 0

Y $ lt gt"fact"

y $ = Chr(onda 1(xx)) amp;chr(onda 1(xx) 1)) amp;chr(onda 1(xx 2)) amp;Chr(onda 1(xx 3))

xx = xx 1

Si xx gt entonces 1000< / p>

xx = 0

Salir Do

Terminará si...

Ring

factpos = xx - 1

Si factpos = -1, entonces factpos = 36

DataLenOut = u límite (onda 1) 1 onda de datos 1 UBound(Wave2) 1 onda de datos 2

ReDim wav buffer(factpos 19 DataLenOut)

3. Escriba el fragmento repetido combinado ("wave")...fmt...[fact]...información del título.

Rtlmovememory wavbuffer (0), Wave1 (0), factpos 'Nota: La frecuencia de muestreo, la velocidad de datos promedio, el tamaño de muestreo y el canal están sujetos a los parámetros de Wave1.

búfer wav(factpos)= Asc(" f "):búfer wav(factpos 1)= Asc(" a ")

búfer wav(factpos 2)= Asc(" c "): búfer wav(factpos 3) = Asc(" t ")

ChunkLen = 4

RtlMoveMemory búfer wav(factpos 4), ChunkLen, 4

RtlMoveMemory búfer wav(factpos 8), DataLenOut, 4

búfer wav(factpos 12)= Asc(" d "):búfer wav(factpos 13)= Asc(" a ")

búfer wav(factpos 14)=Asc(" t "):búfer wav(factpos 15)= Asc(" a ")

Búfer wav RtlMoveMemory(factpos 16), DataLenOut, 4

4. Escriba el bloque de datos fusionado (es decir, todas las muestras, primero Wave1, luego Wave2).

RtlMoveMemory WAVBuffer(factpos 20), Wave1(Datapos1), UBound(wave 1)-datos pos 1 1

RtlMoveMemory WAVBuffer(factpos 20 UBound(wave 1)-datos pos 1 1), Wave2(Datapos2), UBound(Wave2) - Datapos2 1

5 Corregir la información del encabezado RIFF

ChunkLen = UBound(WAVBuffer) - 7

RtlMoveMemory WAVBuffer(4), ChunkLen, 4

6. Fin

WavMerge = WAVBuffer

Finalizar función

Fusionar varios archivos

p>

Función pública booleana f_LinkWav (cFile como colección, sOutFile como cadena)

Atenuar la cabeza hacia adelante como una onda

Atenuar la cabeza como encabezado

El encabezado del archivo nuevo.

Dim byteData() es byte

Dim iFreeFile es un entero

Dim j As Long

Dim j As Long

Atenuar iA

Atenuar lData siempre

f_LinkWav = False

iFreeFile = FreeFile()

Obtener título

p>

cabeza primero = getWavHead(cFile(1))

lData = cabeza primero

ReDim retiene datos de bytes (lData)

abrir strfilename 1 para aleatorio como # 1 Len = 1

Abrir cFile(1) del archivo binario como #iFreeFile

Para i = 0 a lData

Obtener #iFreeFile, 45 i, byteData(i)

Luego

Cerrar #iFreeFile

headNew = headFirst

head new. lngfilelen = cabeza primero. lngdatalenth

cabeza nueva. lngdatalenth = cabeza primero.

Para iA = 2 a cFile. Count

headNext = getWavHead(cFile(iA))

head new. lngfilelen = head new. lngdatalenth 37

head new. head new .lngdatalenth head next . lngdatalenth

ReDim retiene los datos en bytes (lData headNext.lngDataLenth)

Abra el cFile (iA) del archivo binario como #iFreeFile 'Len = 1

Para i = 1 en headNext.lngDataLenth

Obtener #iFreeFile, 44 i, byteData(lData i)

Luego

Cerrar # iFreeFile

lData = lData head next lngdatalenth

Luego

Comience a escribir datos

Abrir para aleatorio como #1 Len = 1 strOutFile.

If Dir(sOutFile, vbNormal)>""Luego elimine el archivo suter

Abra sOutFile de forma aleatoria como #iFreeFile

Ponga #iFreeFile, headNew ' Escriba el encabezado del archivo en el archivo.

Cerrar #iFreeFile

j = UBound(byte de datos) 1

Para iA = 2 en tiempo lógico

ReDim palabra reservada SecciónDatos (UBound(byteData) j)

For i = 0 to j - 1

ByteData(j i) = byteData(i)' Escribe el primer registro en el archivo.

Luego

Siguiente iA

Abra el archivo sout de forma aleatoria como # iFreeFile Len = 1

Para i = 0 a UBound( Byte Data)

Pon #iFreeFile, 45 i, byteData(i)'Escribe el primer registro en el archivo.

Entonces

j = UBound(byte de datos)

Para iA = 2 al tiempo lógico

Para i = 0 a UBound ( byte de datos)

Pon # iffree file, 45 I J 1, bytedata (I)'Escribe el primer registro en el archivo.

Entonces

j = j UBound(byte de datos)

Entonces

' Cerrar #iFreeFile 'Cierra el archivo.

f_LinkWav = True

Finalizar función

Función pública f_MciChkEnd()

Mostrar MCIStatus como cadena * 255

Dimra

f_MciChkEnd = False

lA = mciSendString(" estado modo wav ", MCIStatus, Len(MCIStatus), 0)

Ifucase ( izquierda $ ( mcistatus, 7)) = "detenido " o izquierda $ (mcistatus, 2) = " fin ", luego f_MciChkEnd = True.

Función final

Función pública SendComReturnString(com As String)As String

Dim FeedBack es largo, ReturnString es String * 255

ReturnString = String(255, Chr(0))

FeedBack = mciSendString(com, ReturnString, 255, 0)

Si hay comentarios, entonces

Marcar s para cadena * 255

mciGetErrorString comentarios, s, 255

SendComReturnString = vbNullString

Otro

SendComReturnString = Left(ReturnString,InStr (1 , ReturnString, Chr(0)) - 1)

Terminará si...

Finalizar función