100 / 35 / 21
Регистрация: 17.09.2014
Сообщений: 1,543
1

Выбор аудио устройства(устройства двоятся + имена обрезаны)

21.12.2016, 04:32. Показов 1930. Ответов 7
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Делаю программу которая будет получать данные с микрофонного или линейного входа звуковой карты на выбор.

Кодэ:
C++
1
2
3
4
5
6
7
8
9
10
11
12
hE[0] = CreateWindowExW(NULL, WC_COMBOBOX, NULL, WS_CHILD | WS_VISIBLE | WS_VSCROLL | CBS_AUTOHSCROLL | CBS_DROPDOWNLIST, 10, 10, 431, 200, hWnd, (HMENU)1, hInst, NULL); // Раскрывающийся список
SendMessageA(hE[0], CB_ADDSTRING, NULL, (LPARAM)"Стерео микшер(по умолчанию)"); // 1й пункт
SendMessageW(hE[0], CB_SETCURSEL, NULL, NULL); // Установить 1й пункт как выбранный
 
WAVEINCAPS device; // Структура информации о устройстве
UINT i = -1, deviceNum = waveInGetNumDevs(); // Получить количество устройств
 
while(++i <= deviceNum) // Цикл по устройствам, в справке написано было с 0 начинать...
{
    waveInGetDevCapsW(i, &device, sizeof(device)); // Получить информацию о устройстве
    SendMessageW(hE[0], CB_ADDSTRING, NULL, (LPARAM)device.szPname); // Добавить имя устройства в список
}
Вот что в итоге получается:

Подключен микрофон спереди.
Выбор аудио устройства(устройства двоятся + имена обрезаны)


Подключен микрофон спереди, микрофон сзади, линейный вход.
Выбор аудио устройства(устройства двоятся + имена обрезаны)


Подключен микрофон спереди, микрофон сзади, линейный вход, усб микрофон.
Выбор аудио устройства(устройства двоятся + имена обрезаны)


Как-то странно все это...

Ну и имена обрезаны, гуглил, говорят что в структуре размер строки 31 байт.
Видел что-то меняли в заголовках, то ли помогло, то ли нет.
Я ещё и нашел на булдере каком-то, а не на С++.
Кто знает что сделать нужно?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
21.12.2016, 04:32
Ответы с готовыми решениями:

Как разместить драйвер устройства в Диспетчере устройств в разделе Системные устройства?
Здравствуйте! Можно ли ( если да, то как ? ) отредактировать имеющийся .inf файл от драйвера...

При запуске системы отключаются все USB-устройства, в т.ч. устройства ввода
При запуске видовс 8 появляется экран выбора учетки и сразу отключаются клавиатура и мышь, они...

На чем писать ОС для мобильного устройства или любого эл. устройства
На чем писать ядро системы? ЧТо нужно знать? Assembler ? Дискретная математика. А что еще?

Нету устройства звуковые видео и игровые устройства драйвер
Здравствуйте помогите 2 день мучаюсь, у меня планшет KREXTM1004B32 3G GPS, я переустановил виндус...

7
18 / 18 / 8
Регистрация: 19.09.2015
Сообщений: 47
21.12.2016, 13:30 2
Лучший ответ Сообщение было отмечено артист как решение

Решение

Попробовал обойти ограничение (создав свою структуру увеличив количество символов в строке), не получилось.
Видимо внутри самой waveInGetDevCaps стоит ограничение в размере строки...

Другой способ из DirectSound

C++
1
2
3
4
5
6
7
8
9
10
#include <DSound.h>
#pragma comment( lib, "Dsound.lib" )
 
BOOL CALLBACK DSEnumProcW(LPGUID lpGUID, LPCWSTR lpszDesc, LPCWSTR lpszDrvName, LPVOID lpContext)
{
    SendMessageW(hE[0], CB_ADDSTRING, NULL, lpszDesc);
    return TRUE;
}
 
DirectSoundCaptureEnumerateW(DSEnumProcW, NULL);
1
100 / 35 / 21
Регистрация: 17.09.2014
Сообщений: 1,543
23.12.2016, 14:16  [ТС] 3
Неа, не помогло с длиной...
Вот двоиться перестали...

Выбор аудио устройства(устройства двоятся + имена обрезаны)
0
Заблокирован
23.12.2016, 15:19 4
Лучший ответ Сообщение было отмечено артист как решение

Решение

артист, ну-ка, вот так попробуйте, да и с форматом кодировки проекта определитесь, т.е. или Мультибайт (Анси ) - простая строчка "Василий Алибабаевич" или выбирайте стиль Юникод (Unicode) TEXT("Алло, как слышно? Прием...") L"Аналогично"...
Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
    HWND hwndComboBox;
    hwndComboBox = CreateWindow(WC_COMBOBOX, TEXT(""),
        CBS_DROPDOWN | CBS_HASSTRINGS | WS_CHILD | WS_OVERLAPPED | WS_VISIBLE,
        xpos, ypos, nwidth, nheight, hwndParent, NULL, GInstance, NULL);
    if( NULL == hwndComboBox ) {
        MessageBox(hWnd, TEXT("Cannot create ComboBox"),
            GAppname, MB_OK | MB_ICONSTOP | MB_SETFOREGROUND | MB_TOPMOST);
        SendMessage(hWnd, WM_CLOSE, (WPARAM)0, (LPARAM)0);
    }
 
    MMRESULT Result;
    UINT Devices, Total;
    WAVEINCAPS Waveincaps = {0};
    SendMessageW(hwndComboBox, CB_RESETCONTENT, (WPARAM)0, (LPARAM)0);
    Devices = waveInGetNumDevs();
    for( Total = 0; Total < Devices; ++Total )
    {
        ZeroMemory(&Waveincaps, sizeof(WAVEINCAPS));
        Result = waveInGetDevCaps(Total, &Waveincaps, sizeof(WAVEINCAPS));
        if( 0 == Result ) {
            TCHAR ListItem[256];
            lstrcpy(ListItem, Waveincaps.szPname);
            SendMessageW(hwndComboBox, CB_ADDSTRING, (WPARAM)0, (LPARAM)ListItem);
        }
    }
0
18 / 18 / 8
Регистрация: 19.09.2015
Сообщений: 47
23.12.2016, 18:08 5
артист, Покажи код, как написал.
1
100 / 35 / 21
Регистрация: 17.09.2014
Сообщений: 1,543
24.12.2016, 14:58  [ТС] 6
Вот так:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
VOID UpdateDevice(HWND hWnd) // Поиск устройств ввода
{
    INT curcell = SendMessageA(hE[3], CB_GETCURSEL, NULL, NULL);
    SendMessageA(hWnd, CB_RESETCONTENT, NULL, NULL);
    MMRESULT Result;
    UINT Total = -1, Devices = waveInGetNumDevs();
    WAVEINCAPSW Waveincaps = {0};
 
    while(++Total < Devices)
    {
        ZeroMemory(&Waveincaps, sizeof(WAVEINCAPSW));
        Result = waveInGetDevCapsW(Total, &Waveincaps, sizeof(WAVEINCAPSW));
        if(0 == Result)
        {
            WCHAR ListItem[256];
            lstrcpyW(ListItem, Waveincaps.szPname);
            SendMessageW(hWnd, CB_ADDSTRING, NULL, (LPARAM)ListItem);
        }
    }
    SendMessageA(hE[0], CB_SETCURSEL, NULL, curcell);
}
Длина так же обрезана(я так понял невозможно получить её полностью, можно от драйвера получить оригинальные названия на английском, но заморочено больно).
Но зато устройства не двоятся, пойдет, спасибо ))
0
18 / 18 / 8
Регистрация: 19.09.2015
Сообщений: 47
24.12.2016, 15:28 7
Лучший ответ Сообщение было отмечено артист как решение

Решение

Мой пример с DirectSound, по крайней мере у меня работает нормально, и имена устройств не обрезаются. И в данном случае от функций библиотеки "Waveform" можно отказаться вовсе.
Вот полный код проекта для примера:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
#include <Windows.h>
#include <DSound.h>
#include <CommCtrl.h>
 
#pragma comment( lib, "Dsound.lib" )
 
wchar_t winclass[] = L"test32";
 
HWND hwnd;
HWND hwnd_combobox;
 
BOOL CALLBACK DSEnumProcW(LPGUID lpGUID, LPCWSTR lpszDesc, LPCWSTR lpszDrvName, LPVOID lpContext)
{
    SendMessageW(hwnd_combobox, CB_ADDSTRING, NULL, (LPARAM)lpszDesc);
    return TRUE;
}
 
LRESULT CALLBACK winproc(HWND hwnd, UINT uint, WPARAM wparam, LPARAM lparam)
{
    switch (uint)
    {
    case WM_SYSCOMMAND:
    {
        if (wparam == SC_CLOSE)
        {
            ExitProcess(0);
        }
    }
    }
    return DefWindowProcW(hwnd, uint, wparam, lparam);
}
 
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
    WNDCLASSEXW wc = {
        sizeof(WNDCLASSEXW),
        NULL,
        winproc,
        NULL,
        NULL,
        hInstance,
        LoadIconW(NULL,IDC_ICON),
        LoadCursorW(NULL,IDC_ARROW),
        NULL,
        NULL,
        L"test32",
        NULL
    };
 
 
    MSG msg;
    RegisterClassExW(&wc);
    hwnd = CreateWindowExW(NULL, L"test32", L"Окно", WS_VISIBLE | WS_CAPTION | WS_THICKFRAME | WS_SYSMENU | WS_MINIMIZEBOX | WS_MAXIMIZEBOX, 50, 50, 600, 400, NULL, NULL, NULL, NULL);
    
    hwnd_combobox = CreateWindowExW(NULL, WC_COMBOBOX, NULL, WS_CHILD | WS_VISIBLE | WS_VSCROLL | CBS_AUTOHSCROLL | CBS_DROPDOWNLIST, 10, 10, 431, 200, hwnd, (HMENU)1, NULL, NULL);
    SendMessageW(hwnd_combobox, CB_ADDSTRING, NULL, (LPARAM)L"Стерео микшер(по умолчанию)"); // 1й пункт
    SendMessageW(hwnd_combobox, CB_SETCURSEL, NULL, NULL); // Установить 1й пункт как выбранный
 
    DirectSoundCaptureEnumerateW(DSEnumProcW, NULL);
    
    while (1)
    {
        GetMessageW(&msg, NULL, NULL, NULL);
        DispatchMessageW(&msg);
        TranslateMessage(&msg);
    }
    return 0;
}
1
100 / 35 / 21
Регистрация: 17.09.2014
Сообщений: 1,543
25.12.2016, 19:01  [ТС] 8
Да, спасибо большое, всё отлично теперь отображается ))

П.с. интернет лагает(час есть, два дня нет) поэтому не сразу пишу...
0
25.12.2016, 19:01
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
25.12.2016, 19:01
Помогаю со студенческими работами здесь

При запуске устройства в Genymotion в окне устройства просто черное поле и кнопки рядом с ним
У меня такая проблема с дженимоушн. При запуске какого-либо устройства получается такое: просто...

Получение названия устройства из файла устройства
Как получить название устройства из файла устройства?

Выбор устройства
Здравствуйте!Я учусь на 2 курсе коледжа на программиста и собирался покупать мощный ноутбук который...

Выбор устройства
Доброго времени суток! Подскажите, пожалуйста: К компьютеру подключено две мыши. Одна мышь -...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2023, CyberForum.ru