Cómo verificar todos los filtros dshow en el sistemaDetalla cómo usar DirectSound para capturar datos que pasan a través de la tarjeta de sonido y el micrófono, grabarlos y guardarlos como un archivo con formato de forma de onda. He estudiado el desarrollo de Directshow, pero nunca he estudiado Dsound detenidamente. Solo sabía que Dsound era para el desarrollo de audio y siempre pensé que la estructura de su sistema era similar a Dshow. Después de un estudio cuidadoso, descubrí que en realidad son dos. cosas completamente diferentes. DirectSound también se basa en COM, pero a diferencia de Dshow, aunque DirectSound también se basa en COM, no es como Dshow, donde varios filtros forman una lista vinculada. Sin más preámbulos, echemos un vistazo a lo que DirectSound puede hacer por nosotros. 1. Reproduzca archivos o recursos de audio en formato WAVE. 2. Se pueden reproducir varios audios al mismo tiempo. 3. Asigne sonidos de alta prioridad a buffers controlados por hardware 4. Reproduzca sonido estéreo 3D 5. Agregue efectos especiales al sonido, como eco, parámetros de acrobacias que cambian dinámicamente, etc. 6. Convierta el sonido grabado por el micrófono u otro dispositivo de entrada de audio a un archivo en formato WAVE. Hay tantas cosas que DirectSound puede hacer. En este punto, tengo algunas dudas de que DirectSound encapsule las funciones de las series mmio y wav. Porque estas API de bajo nivel también pueden hacer estas cosas. Aquí, discutiremos principalmente cómo usar DirectSound para grabarlo y guardarlo como un archivo en formato Wave. Antes de comenzar a trabajar, primero debemos presentar tres objetos muy importantes grabados por DirectSound: -IDirectSoundCapture8, objeto de dispositivo, un objeto de dispositivo creado en función del dispositivo que está grabando. Utilice este objeto para obtener las propiedades del dispositivo. -IDirectSoundCaptureBuffer8, objeto de búfer, este objeto es creado por el objeto del dispositivo y se usa principalmente para operar datos de audio -IDirectSoundNotify8, objeto de notificación de eventos, este objeto se usa para notificar a la aplicación que tome los datos del búfer y los escriba en el archivo y guárdalo. La idea principal de usar la grabación DirectSound es crear primero un objeto de dispositivo basado en el dispositivo de grabación seleccionado y luego crear un objeto de búfer auxiliar a través del objeto del dispositivo. Al iniciar la grabación, el dispositivo escribirá datos en el búfer y el. La aplicación leerá activamente los datos del búfer. Leer datos y escribir datos en un archivo puede realizar la función de grabación. Aquí hay una breve introducción a la función de notificación de dsound. La aplicación creará un objeto de notificación, luego indicará el objeto de notificación y luego establecerá la posición de notificación (posición). Por ejemplo, el tamaño del búfer es 4000. bytes Si desea usarlo como datos Cuando se alcance la mitad del búfer, se le puede notificar que comience a copiar datos. En este momento, puede configurar la posición de notificación en 2000. La posición de notificación se puede configurar arbitrariamente. Los datos en el búfer alcanzan la posición que usted estableció, se notificará a la aplicación para que copie el búfer. Los datos se copian al archivo. El búfer se usa cíclicamente. Cuando el búfer se llena, los datos se completarán desde el principio. el buffer es un proceso simultáneo de lectura y escritura. Permítame hablar sobre los pasos principales de la grabación a continuación, que pueden aclarar su pensamiento. 1. Enumere los dispositivos utilizados para la grabación. 2. Cree un objeto de dispositivo basado en el dispositivo seleccionado. 3. Utilice el objeto de dispositivo para crear un objeto de búfer. 4. Establecer notificaciones. Mecanismo 5. Cree un hilo de trabajo para escribir los datos del búfer en el archivo.
Primero defina los datos utilizados LPDIRECTSOUNDCAPTURE8 g_pDSCapture = NULL; // Puntero de objeto de dispositivo LPDIRECTSOUNDCAPTUREBUFFER g_pDSBCapture = NULL; // Puntero de objeto de búfer LPDIRECTSOUNDNOTIFY8 g_pDSNotify = NULL // Interfaz de objeto utilizada para configurar la notificación GUID g_guidCaptureDevice = GUID_NULL; FALSE; //Si está grabando o no WAVEFORMATEX g_wfxInput; //Formato de audio de entrada DSBPOSITIONNOTIFY g_aPosNotify[ NUM_REC_NOTIFICATIONS 1 ]; //Matriz para configurar indicadores de notificación HANDLE g_hNotificationEvent; //Evento de notificación BOOL g_abInputFormatSupported[20]; tamaño del búfer de grabación DWORD g_dwNextCaptureOffset; // posición de desplazamiento DWORD g_dwNotifySize; // notificación CWaveFile* g_pWaveFile; // Enumerar dispositivos de grabación Si su programa solo desea grabar desde el dispositivo predeterminado del usuario, al llamar a DirectSoundCaptureCreate8 u otras funciones, hay no es necesario enumerar todos los dispositivos de grabación del sistema. Cuando llama a DirectSoundFullDuplexCreate8 u otras funciones, en realidad está especificando un dispositivo de grabación predeterminado de forma predeterminada. Por supuesto, debe enumerar todos los dispositivos en el sistema si, por ejemplo, su aplicación no admite todos los dispositivos de salida, o su aplicación requiere dos o más dispositivos, o si desea que el usuario elija el dispositivo de salida por sí mismo. Para enumerar dispositivos, primero debe definir una función de devolución de llamada. Cada dispositivo en el sistema puede llamar a esta función. Puede hacer lo que quiera en cada función. No hay restricciones en el nombre de la función, pero la función debe modelarse. después de DSEnumCallback, si la enumeración no ha finalizado, la función de devolución de llamada devuelve VERDADERO, si la enumeración finaliza, por ejemplo, encontró el dispositivo correcto, la función devuelve FALSO. A continuación se muestra un ejemplo de una función de devolución de llamada que agrega cada dispositivo en la enumeración al combox y guarda el GUID del dispositivo en un proyecto. Los primeros tres parámetros de la función los proporciona el controlador del dispositivo. DSEnumProc(LPGUID lpGUID, LPCTSTR lpszDesc, LPCTSTR lpszDrvName, LPVOID lpContext){HWND hCombo = (HWND)lpContext; LPGUID lpTemp = NULL if (lpGUID != NULL) // NULL solo se aplica al "Controlador de sonido principal".