> Все есть! > отдельный пример как позвонить ( конечно с использованием > ТАПИ) > и > отдельный пример использования waveOutWrite и т.д > (низкоуровневые функции работы со звуком) > Только никак не соображу как его в линию проиграть? > Немного бы продолжил! А? >
Как получить DeviceID для waveOutOpen я написал. Одни из граблей: его надо обязательно открывать с флагом WAVE_MAPPED - это позволяет винде преобразовывать форматы перед выводом в устройство (частоту, битовость и количество каналов). Без этого, если например, твой модем не поддерживает 44100 Гц, 16 бит, Stereo, то попытка открыть такое устройство без WAVE_MAPPED вывалится с ошибкой "Неправильный формат". После этого наделать буферов для вывода, подготовить их (waveOutPrepareHeader()), добавить в очередь для вывода (waveOutWrite()), в колбяке сделать waveUnprepareHeader/wavePrepareHeader (хотя я просто сбрасывал флаг DONE и устанавливал PREPARED и все работало). Заново заполнить буфер и записать. Если есть пример, то я даже зря все это рассказываю. MM подсистема выглядит загадочно только пока не увидишь как реально с ней работать. Если у тебя нет RAW звука для проигрывания - посмотри на mmioOpen/... для работы с WAV-форматом, а про использование функций в том же ddrec-е - тоже все довольно прозрачно
Во первых открывать линию (после инициализации и всего остального) нужно c LINEMEDIAMODE_AUTOMATEDVOICE:
// ...
lineOpen(hLineApp, dwDeviceID, &hLine, dwAPIVersion, 0, 0, LINECALLPRIVILEGE_NONE, LINEMEDIAMODE_AUTOMATEDVOICE, NULL);
Во-вторых при дозвоне в параметрах указать ту же константу:
// ...
lineCallParams.dwMediaMode = LINEMEDIAMODE_AUTOMATEDVOICE;
dwCompletionID = lineMakeCall(hLine, &hCall, numba, 0, &lineCallParams);
В-третьих, получить ID wave устройств для ввода/вывода звука:
DWORD DeviceInID, DeviceOutID;
// ...
lpDeviceID = calloc(sizeof(VARSTRING), 1);
lpDeviceID->dwTotalSize = sizeof(VARSTRING);
lineGetID(0, 0, hCall, LINECALLSELECT_CALL, lpDeviceID, "wave/in");
if (lpDeviceID->dwNeededSize > lpDeviceID->dwTotalSize) {
lpDeviceID = realloc(lpDeviceID, lpDeviceID->dwNeededSize);
lpDeviceID->dwTotalSize = lpDeviceID->dwNeededSize;
lineGetID(0, 0, hCall, LINECALLSELECT_CALL, lpDeviceID, "wave/in");
}
DeviceInID = *((ULONG *)((char *)lpDeviceID + sizeof(VARSTRING)));
lineGetID(0, 0, hCall, LINECALLSELECT_CALL, lpDeviceID, "wave/out");
if (lpDeviceID->dwNeededSize > lpDeviceID->dwTotalSize) {
lpDeviceID = realloc(lpDeviceID, lpDeviceID->dwNeededSize);
lpDeviceID->dwTotalSize = lpDeviceID->dwNeededSize;
lineGetID(0, 0, hCall, LINECALLSELECT_CALL, lpDeviceID, "wave/out");
}
DeviceOutID = *((ULONG *)((char *)lpDeviceID + sizeof(VARSTRING)));
free(lpDeviceID);
Вообще-то есть "wave/in/out", но у меня он не работал
Кроме того умнее сделать функцию: GetWaveID(LPCSTR). И вызывать
DeviceInID = GetWaveID("wave/in");
DeviceOutID = GetWaveID("wave/out");
Ну а работа с MM это отдельный разговор. Можешь поискать в MSDN-е (точнее в KB) файлик ddrec (Direct-to-Disk Recorder) - там все очень хорошо проиллюстрировано. Или просто в MSDN-е посмотреть функции waveInXxx, waveOutXxx (начинать с waveInOpen() и waveOutOpen(), которым нужны как раз те IS-шники которые ты получишь у TAPI)
Это опять я :-)))30.12.02 17:11 Автор: rom30 Статус: Незарегистрированный пользователь
Все есть!
отдельный пример как позвонить ( конечно с использованием ТАПИ)
и
отдельный пример использования waveOutWrite и т.д (низкоуровневые функции работы со звуком)
Только никак не соображу как его в линию проиграть?
Немного бы продолжил! А?
> Во первых открывать линию (после инициализации и всего > остального) нужно c LINEMEDIAMODE_AUTOMATEDVOICE: > > // ...
> lineOpen(hLineApp, dwDeviceID, &hLine, dwAPIVersion, 0, 0,
> LINECALLPRIVILEGE_NONE, LINEMEDIAMODE_AUTOMATEDVOICE,
> NULL);
> > Во-вторых при дозвоне в параметрах указать ту же константу: > > // ...
> lineCallParams.dwMediaMode = LINEMEDIAMODE_AUTOMATEDVOICE;
> dwCompletionID = lineMakeCall(hLine, &hCall, numba, 0,
> &lineCallParams);
> > > В-третьих, получить ID wave устройств для ввода/вывода > звука: > > DWORD DeviceInID, DeviceOutID;
> // ...
> lpDeviceID = calloc(sizeof(VARSTRING), 1);
> lpDeviceID->dwTotalSize = sizeof(VARSTRING);
> lineGetID(0, 0, hCall, LINECALLSELECT_CALL, lpDeviceID,
> "wave/in");
> if (lpDeviceID->dwNeededSize >
> lpDeviceID->dwTotalSize) {
> lpDeviceID = realloc(lpDeviceID,
> lpDeviceID->dwNeededSize);
> lpDeviceID->dwTotalSize =
> lpDeviceID->dwNeededSize;
> lineGetID(0, 0, hCall, LINECALLSELECT_CALL,
> lpDeviceID, "wave/in");
> }
> DeviceInID = *((ULONG *)((char *)lpDeviceID +
> sizeof(VARSTRING)));
>
> lineGetID(0, 0, hCall, LINECALLSELECT_CALL, lpDeviceID,
> "wave/out");
> if (lpDeviceID->dwNeededSize >
> lpDeviceID->dwTotalSize) {
> lpDeviceID = realloc(lpDeviceID,
> lpDeviceID->dwNeededSize);
> lpDeviceID->dwTotalSize =
> lpDeviceID->dwNeededSize;
> lineGetID(0, 0, hCall, LINECALLSELECT_CALL,
> lpDeviceID, "wave/out");
> }
> DeviceOutID = *((ULONG *)((char *)lpDeviceID +
> sizeof(VARSTRING)));
>
> free(lpDeviceID);
> > Вообще-то есть "wave/in/out", но у меня он не работал > Кроме того умнее сделать функцию: GetWaveID(LPCSTR). И > вызывать > > DeviceInID = GetWaveID("wave/in");
> DeviceOutID = GetWaveID("wave/out");
> > Ну а работа с MM это отдельный разговор. Можешь поискать в > MSDN-е (точнее в KB) файлик ddrec (Direct-to-Disk Recorder) > - там все очень хорошо проиллюстрировано. Или просто в > MSDN-е посмотреть функции waveInXxx, waveOutXxx (начинать с > waveInOpen() и waveOutOpen(), которым нужны как раз те > IS-шники которые ты получишь у TAPI)
Это опять я :-)))02.01.03 17:20 Автор: amirul <Serge> Статус: The Elderman
> Все есть! > отдельный пример как позвонить ( конечно с использованием > ТАПИ) > и > отдельный пример использования waveOutWrite и т.д > (низкоуровневые функции работы со звуком) > Только никак не соображу как его в линию проиграть? > Немного бы продолжил! А? >
Как получить DeviceID для waveOutOpen я написал. Одни из граблей: его надо обязательно открывать с флагом WAVE_MAPPED - это позволяет винде преобразовывать форматы перед выводом в устройство (частоту, битовость и количество каналов). Без этого, если например, твой модем не поддерживает 44100 Гц, 16 бит, Stereo, то попытка открыть такое устройство без WAVE_MAPPED вывалится с ошибкой "Неправильный формат". После этого наделать буферов для вывода, подготовить их (waveOutPrepareHeader()), добавить в очередь для вывода (waveOutWrite()), в колбяке сделать waveUnprepareHeader/wavePrepareHeader (хотя я просто сбрасывал флаг DONE и устанавливал PREPARED и все работало). Заново заполнить буфер и записать. Если есть пример, то я даже зря все это рассказываю. MM подсистема выглядит загадочно только пока не увидишь как реально с ней работать. Если у тебя нет RAW звука для проигрывания - посмотри на mmioOpen/... для работы с WAV-форматом, а про использование функций в том же ddrec-е - тоже все довольно прозрачно
Смотря что ты хочешь сделать!30.12.02 11:21 Автор: choor Статус: Elderman