Home | Info | Community | Development | myReactOS | Contact Us
Definition at line 29 of file audio_test.c.
Referenced by main().
{ SP_DEVICE_INTERFACE_DATA InterfaceData; SP_DEVINFO_DATA DeviceData; PSP_DEVICE_INTERFACE_DETAIL_DATA DetailData; HDEVINFO DeviceHandle; PKSDATAFORMAT_WAVEFORMATEX DataFormat; PKSPIN_CONNECT PinConnect; PKSSTREAM_HEADER Packet; PKSPROPERTY Property; KSSTATE State; DWORD Length; HANDLE FilterHandle; HANDLE PinHandle; PSHORT SoundBuffer; UINT i = 0; BOOL Result; NTSTATUS Status; // // Get a handle to KS Audio Interfaces // DeviceHandle = SetupDiGetClassDevs(&CategoryGuid, NULL, NULL, DIGCF_DEVICEINTERFACE); //DIGCF_PRESENT printf("DeviceHandle %p\n", DeviceHandle); // // Enumerate the first interface // InterfaceData.cbSize = sizeof(InterfaceData); InterfaceData.Reserved = 0; Result = SetupDiEnumDeviceInterfaces(DeviceHandle, NULL, &CategoryGuid, 1, &InterfaceData); printf("SetupDiEnumDeviceInterfaces %u Error %ld\n", Result, GetLastError()); // // Get the interface details (namely the device path) // Length = sizeof(SP_DEVICE_INTERFACE_DETAIL_DATA) + MAX_PATH * sizeof(WCHAR); DetailData = (PSP_DEVICE_INTERFACE_DETAIL_DATA)HeapAlloc(GetProcessHeap(), 0, Length); DetailData->cbSize = sizeof(SP_DEVICE_INTERFACE_DETAIL_DATA); DeviceData.cbSize = sizeof(DeviceData); DeviceData.Reserved = 0; Result = SetupDiGetDeviceInterfaceDetail(DeviceHandle, &InterfaceData, DetailData, Length, NULL, &DeviceData); wprintf(L"SetupDiGetDeviceInterfaceDetail %u Path DetailData %s\n", Result, (LPWSTR)&DetailData->DevicePath[0]); // // Open a handle to the device // FilterHandle = CreateFile(DetailData->DevicePath, GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); printf("Handle %p\n", FilterHandle); // // Close the interface handle and clean up // SetupDiDestroyDeviceInfoList(DeviceHandle); // // Allocate a KS Pin Connection Request Structure // Length = sizeof(KSPIN_CONNECT) + sizeof(KSDATAFORMAT_WAVEFORMATEX); printf("Length %ld KSPIN %u DATAFORMAT %u\n", Length, sizeof(KSPIN_CONNECT), sizeof(KSDATAFORMAT_WAVEFORMATEX)); PinConnect = (PKSPIN_CONNECT)HeapAlloc(GetProcessHeap(), 0, Length); DataFormat = (PKSDATAFORMAT_WAVEFORMATEX)(PinConnect + 1); // // Setup the KS Pin Data // PinConnect->Interface.Set = KSINTERFACESETID_Standard; PinConnect->Interface.Id = KSINTERFACE_STANDARD_STREAMING; PinConnect->Interface.Flags = 0; PinConnect->Medium.Set = KSMEDIUMSETID_Standard; PinConnect->Medium.Id = KSMEDIUM_TYPE_ANYINSTANCE; PinConnect->Medium.Flags = 0; PinConnect->PinId = 0; PinConnect->PinToHandle = NULL; PinConnect->Priority.PriorityClass = KSPRIORITY_NORMAL; PinConnect->Priority.PrioritySubClass = 1; // // Setup the KS Data Format Information // DataFormat->WaveFormatEx.wFormatTag = WAVE_FORMAT_PCM; DataFormat->WaveFormatEx.nChannels = 2; DataFormat->WaveFormatEx.nSamplesPerSec = 48000; DataFormat->WaveFormatEx.nBlockAlign = 4; DataFormat->WaveFormatEx.nAvgBytesPerSec = 48000 * 4; DataFormat->WaveFormatEx.wBitsPerSample = 16; DataFormat->WaveFormatEx.cbSize = 0; DataFormat->DataFormat.FormatSize = sizeof(KSDATAFORMAT) + sizeof(WAVEFORMATEX); DataFormat->DataFormat.Flags = KSDATAFORMAT_ATTRIBUTES; DataFormat->DataFormat.Reserved = 0; DataFormat->DataFormat.MajorFormat = KSDATAFORMAT_TYPE_AUDIO; DataFormat->DataFormat.SubFormat = KSDATAFORMAT_SUBTYPE_PCM; DataFormat->DataFormat.Specifier = KSDATAFORMAT_SPECIFIER_WAVEFORMATEX; DataFormat->DataFormat.SampleSize = 4; // // Create the pin // Status = KsCreatePin(FilterHandle, PinConnect, GENERIC_WRITE, &PinHandle); printf("PinHandle %p Status %lx\n", PinHandle, Status); // // Allocate a buffer for 1 second // Length = 48000 * 4; SoundBuffer = (PSHORT)HeapAlloc(GetProcessHeap(), 0, Length); // // Fill the buffer with a 500 Hz sine tone // while (i < Length / 2) { // // Generate the wave for each channel: // Amplitude * sin( Sample * Frequency * 2PI / SamplesPerSecond ) // SoundBuffer[i] = 0x7FFF * sin(0.5 * (i - 1) * 500 * _2pi / 48000); i++; SoundBuffer[i] = 0x7FFF * sin((0.5 * i - 2) * 500 * _2pi / 48000); i++; } // // Create and fill out the KS Stream Packet // Packet = (PKSSTREAM_HEADER)HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(KSSTREAM_HEADER)); Packet->Data = SoundBuffer; Packet->FrameExtent = Length; Packet->DataUsed = Length; Packet->Size = sizeof(KSSTREAM_HEADER); Packet->PresentationTime.Numerator = 1; Packet->PresentationTime.Denominator = 1; // // Setup a KS Property to change the state // Property = (PKSPROPERTY)HeapAlloc(GetProcessHeap(), 0, sizeof(KSPROPERTY)); Property->Set = KSPROPSETID_Connection; Property->Id = KSPROPERTY_CONNECTION_STATE; Property->Flags = KSPROPERTY_TYPE_SET; // // Change the state to run // State = KSSTATE_RUN; DeviceIoControl(PinHandle, IOCTL_KS_PROPERTY, Property, sizeof(KSPROPERTY), &State, sizeof(State), &Length, NULL); // // Play our 1-second buffer // DeviceIoControl(PinHandle, IOCTL_KS_WRITE_STREAM, NULL, 0, Packet, Packet->Size, &Length, NULL); // // Change the state to stop // State = KSSTATE_STOP; DeviceIoControl(PinHandle, IOCTL_KS_PROPERTY, Property, sizeof(KSPROPERTY), &State, sizeof(State), &Length, NULL); CloseHandle(PinHandle); CloseHandle(FilterHandle); }