Легенда:
новое сообщение
закрытая нитка
новое сообщение
в закрытой нитке
старое сообщение
|
- Напоминаю, что масса вопросов по функционированию форума снимается после прочтения его описания.
- Новичкам также крайне полезно ознакомиться с данным документом.
Господа, будьте снисходительны, не бросайтесь сразу штрафовать за, как вам кажется, глупые вопросы - beginners на то и beginners.
| |
Это опять я :-))) 30.12.02 17:11 Число просмотров: 2168
Автор: 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)
|
<beginners>
|
Как же проиграть звук в телеф. линию? 30.12.02 06:06
Автор: rom30 Статус: Незарегистрированный пользователь
|
|
|
Это опять я :-))) 30.12.02 14:36
Автор: amirul <Serge> Статус: The Elderman
|
Во первых открывать линию (после инициализации и всего остального) нужно 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
|
Какая твоя задача?
|
| |
Посмотри пож-та "это опять я" - я изложил там что мне надо 30.12.02 17:15
Автор: rom30 Статус: Незарегистрированный пользователь
|
|
|
|