Red de conocimiento informático - Computadora portátil - C++ reproduce archivos de audio en otros formatos

C++ reproduce archivos de audio en otros formatos

Primero comience con los archivos de encabezado incluidos necesarios para llamar a la interfaz de programación ACM:

#include

#include

#include // Registro multimedia

#include // Administrador de compresión de audio

#include

El archivo de encabezado mmsystem.h especifica que Windows admite la mayoría de las funciones multimedia, pero no incluye la interfaz ACM

ni ninguna definición del fabricante. mmreg.h contiene las definiciones de varias etiquetas de formato de tipo de datos de onda

diseñadas por diferentes fabricantes. También contiene definiciones de estructuras (basadas en WAVEFORAMTEX) para manejar diferentes tipos de datos de olas. msacm.h contiene las API requeridas por ACM, indicadores, etc.

Lo primero que tenemos que hacer es realizar algunas consultas habituales de ACM para determinar el número de versión y obtener información como

cuántos controladores gestiona actualmente. Lo siguiente es parte del código para consultar ACM:

// Obtener el número de versión de ACM

DWORD dwACMVer = acmGetVersion()

printf("ACM; versión %u. %.02u compilación %u", HIWORD(dwACMVer) >> 8, HIWORD(dwACMVer) & 0x00FF, LOWORD(dwACMVer));

if (LOWORD(dwACMVer) == 0) printf(" (Venta minorista)");

printf("\n");

// Mostrar información de ACM

printf("Métricas de ACM: \n" );

DWORD dwCodecs = 0;

MMRESULT mmr = acmMetrics(NULL, ACM_METRIC_COUNT_CODECS, &dwCodecs);

if (mmr) {

show_error(mmr);

}

else {

printf("%lu códecs instalados\n", dwCodecs

}

La instancia CAPS consulta más información de ACM. Puede observar más de cerca su código y ejecutar el programa para obtener los resultados.

Después de tener una breve comprensión de ACM, ahora puede pedirle que enumere todos los controladores actualmente en el sistema

. La función de enumeración que llamamos en el programa utiliza una función de devolución de llamada para informar los datos de cada dispositivo

, que es un método muy común en la programación de Windows.

La siguiente llamada es para enumerar

todos los dispositivos administrados actualmente por ACM:

// Enumerar todos los controladores permitidos

printf("Controladores habilitados: \n") ;

mmr = acmDriverEnum(DriverEnumProc, 0, 0);

if (mmr) show_error(mmr);

Al igual que otras funciones multimedia, muchas funciones ACM. Las llamadas devuelven un valor MMRESULT, que indica los errores que pueden ocurrir. Un valor de 0 indica que la función se ejecutó correctamente.

Ahora, veamos la función de devolución de llamada de enumeración DriverEnumProc, que es llamada por todos los controladores del sistema: BOOL CALLBACK DriverEnumProc(HACMDRIVERID hadid, DWORD dwInstance, DWORD fdwSupport )

{

printf (" id: %8.8lxH", hadid);

printf(" admite:\n");

if (fdwSupport & ACMDRIVERDETAILS_SUPPORTF_ASYNC) printf(" conversiones asíncronas\n"

if (fdwSupport & ACMDRIVERDETAILS_SUPPORTF_CODEC) printf(" conversiones de formato diferente\n");

if (fdwSupport & ACMDRIVERDETAILS_SUPPORTF_CONVERTER) printf(" conversiones del mismo formato\n");

if (fdwSupport & ACMDRIVERDETAILS_SUPPORTF_FILTER) printf(" filtering\n");

// Obtener información específica

ACMDRIVERDETAILS dd; p> dd.cbStruct = sizeof(dd);

MMRESULT mmr = acmDriverDetails(hadid, &dd, 0);

if (mmr) {

printf (" "); show_error(mmr);

}

else {

printf(" Nombre corto: %s\n", dd.szShortName)

printf(" Nombre largo: %s\n", dd.szLongName

printf (" Copyright: %s\n", dd.szCopyright

printf(" Licencia: %s\n", dd.szLicensing

printf(" Características: %s\n", dd.szFeatures); > printf(" Soporta %u formatos\n", dd.cFormatTags);

printf(" Soporta %u formatos de filtro\ n", dd.cFilterTags

}

//

Abrir controlador

HACMDRIVER had = NULL

mmr = acmDriverOpen(&had, hadid, 0

if (mmr) {

< p); > printf(" "); show_error(mmr);

}

más {

DWORD dwSize = 0

mmr = acmMetrics(had, ACM_METRIC_MAX_SIZE_FORMAT, &dwSize);

if (dwSize cbSize = LOWORD(dwSize) - sizeof(WAVEFORMATEX);

pwf->wFormatTag = WAVE_FORMAT_UNKNOWN;

ACMFORMATDETAILS fd;

memset(&fd, 0, tamaño de(fd));

fd.cbStruct = tamaño de

fd. = pwf;

fd.cbwfx = dwSize;

fd.dwFormatTag = WAVE_FORMAT_UNKNOWN

mmr = acmFormatEnum(had, &fd, FormatEnumProc, 0, 0 ) ;

if (mmr) {

printf(" "

show_error(mmr)

}

);

free(pwf);

acmDriverClose(had, 0);

}

return TRUE // Continuar enumeración

/t/20030724/14/2066679.html

http://www.qcode.org/soft/v/c/174/Soft_174_1.html