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
#include
#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) { p>
show_error(mmr);
}
else {
printf("%lu códecs instalados\n", dwCodecs ); p>
}
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 ); p>
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