|
|
|
Проблема с WaitForSingleEvent
|
|||
|---|---|---|---|
|
#18+
Здравствуйте. В системе есть две звуковые платы, на каждой плате по два канала воспроизведения, а также по два канала записи(Line In). Для записи и для воспроизведение в программе выделено по потоку, т.е. для воспроизведения отдельный поток и для записи отделный поток. Эти потоки работают одновременно. Рассмотрим поток воспроизведения. В потоке воспроизведения на каждую звуковую карту выделяются два буфера исходя из той идеи, что пока воспроизводиться один буфер, второй в это время подготавливается данными и соответственно, пока второй воспроизводиться, первый подготавливается данными. Допустим, что первый буфер для первой звуковой карты мы будем называть П1, второй буфер для первой звуковой карты (П2), первый буфер для второй звуковой карты В1, а второй буфер для второй звуковой карты В2. Вот пример кода: // Делаем события обеих карт "свободными", // т.к. после WaveOutOpen они будут в состоянии "занято" ResetEvent(1); // Делаем событие для первой карты "свободным" ResetEvent(2); // Делаем событие для второй карты "свободным" // Расчитываем данные для первого буфера первой звуковой карты (П1) // и для первого буфера второй звуковой карты (В1) Calc(1); WaveOutWrite(1, ...); // Отправляем первый буфер для первой звуковой карты (П1) WaveOutWrite(2, ...); // Отправляем первый буфер для второй звуковой карты (В1) // Расчитываем данные для второго буфера первой звуковой карты (П2) // и для второго буфера второй звуковой карты (В2) Calc(2); WaveOutWrite(1, ...); // Отправляем второй буфер для первой звуковой карты (П2) WaveOutWrite(2, ...); // Отправляем второй буфер для второй звуковой карты (В2) while (TRUE) { WaitForSingleObject(1); // Ожидаем когда закончит воспроизводиться первый буфер для первой звуковой карты (П1) WaitForSingleObject(2); // Ожидаем когда закончит воспроизводиться первый буфер для второй звуковой карты (В1) // Расчитываем данные для первого буфера первой звуковой карты (П1) // и для первого буфера второй звуковой карты (В1) Calc(1); WaveOutWrite(1, ...); // Отправляем первый буфер для первой звуковой карты (П1) WaveOutWrite(2, ...); // Отправляем первый буфер для второй звуковой карты (В1) WaitForSingleObject(1); // Ожидаем когда закончит воспроизводиться второй буфер для первой звуковой карты (П2) WaitForSingleObject(2); // Ожидаем когда закончит воспроизводиться второй буфер для второй звуковой карты (В2) // Расчитываем данные для второго буфера первой звуковой карты (П2) // и для второго буфера второй звуковой карты (В2) Calc(2); WaveOutWrite(1, ...); // Отправляем второй буфер для первой звуковой карты (П2) WaveOutWrite(2, ...); // Отправляем второй буфер для второй звуковой карты (В2) } Функция Calc(int) сделана так, что по данным второй буфер является продолжением первого и соответственно первый продолжением второго, так что по данным переходы из буфера в буфер плавный. Если подключить осциллограф к какому-нибудь каналу, то можно увидеть, что между сигналами есть паузы. Если убрать WaitForSingleObject(1, ...); // Ожидаем когда закончит воспроизводиться второй буфер для первой звуковой карты (П2) WaitForSingleObject(2, ...); // Ожидаем когда закончит воспроизводиться второй буфер для второй звуковой карты (В2) из цикла, то можно увидеть, что буфера накладываются друг на друга. Отсюда всевозможные щелчки ну и т.д. Такое впечатление, что функция WaitForSingleObject(1, ...) не выполняет то для чего она предназначена, а именно оповещение программы оо окончании проигрывания буфера. Вопрос: Как это все вылечить? Размер буфера 64Кб, частота дискретизации 44100Гц, размер сэмпла 16 бит, сигнал стерео. Спасибо. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.12.2005, 10:25 |
|
||
|
Проблема с WaitForSingleEvent
|
|||
|---|---|---|---|
|
#18+
Непонятно, где запускаютя потоки и вызываются SetEvent? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.12.2005, 11:22 |
|
||
|
Проблема с WaitForSingleEvent
|
|||
|---|---|---|---|
|
#18+
Все делается до начала цикла. Только объекты событий создаются через CreateEvent(); ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.12.2005, 12:37 |
|
||
|
Проблема с WaitForSingleEvent
|
|||
|---|---|---|---|
|
#18+
Никаких SetEvent я не использую ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.12.2005, 12:47 |
|
||
|
Проблема с WaitForSingleEvent
|
|||
|---|---|---|---|
|
#18+
Как же так? Ведь WaitForSingleObject как раз и ждут, когда событие будет установлено вызовом SetEvent ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.12.2005, 13:03 |
|
||
|
Проблема с WaitForSingleEvent
|
|||
|---|---|---|---|
|
#18+
А разве оно автоматически не устанавливается функцией WaveOutWrite(); ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.12.2005, 13:29 |
|
||
|
Проблема с WaitForSingleEvent
|
|||
|---|---|---|---|
|
#18+
KALAKOMА разве оно автоматически не устанавливается функцией WaveOutWrite(); Я не знаю, что это за функция. Судя по логике она должна запускать какой-то поток, который и пишет данные в буфер (или устанавливать некоторое событие, котрое будит уже существующий поток). Этот поток, по завершении записи и должен устанавливать события, которые ожидаются в WaitForSingleObject ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.12.2005, 13:40 |
|
||
|
Проблема с WaitForSingleEvent
|
|||
|---|---|---|---|
|
#18+
Это же вопрос я задал на другом форуме, вот что пишут по этому поводу http://forum.sources.ru/index.php?showtopic=127166 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.12.2005, 13:56 |
|
||
|
Проблема с WaitForSingleEvent
|
|||
|---|---|---|---|
|
#18+
Понятно. В общем то алгоритм, предложенный Вами вполне приемлемый (хотя я бы сделал по-другому :)). Вопрос в том как должны работать функции WaveOutWrite и Calc. Я бы реализовал их как поточные функции примерно так: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.12.2005, 14:44 |
|
||
|
Проблема с WaitForSingleEvent
|
|||
|---|---|---|---|
|
#18+
Спасибо за ответ. Буду пробовать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.12.2005, 15:46 |
|
||
|
Проблема с WaitForSingleEvent
|
|||
|---|---|---|---|
|
#18+
:) Да SetEvent теперь в Код: plaintext 1. 2. 3. 4. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.12.2005, 15:49 |
|
||
|
Проблема с WaitForSingleEvent
|
|||
|---|---|---|---|
|
#18+
_Балтика:) Да SetEvent теперь в Код: plaintext 1. 2. 3. 4. Осталось от первоначального варианта :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.12.2005, 15:51 |
|
||
|
|

start [/forum/topic.php?fid=57&msg=33458775&tid=2032219]: |
0ms |
get settings: |
9ms |
get forum list: |
18ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
38ms |
get topic data: |
8ms |
get forum data: |
2ms |
get page messages: |
28ms |
get tp. blocked users: |
1ms |
| others: | 218ms |
| total: | 328ms |

| 0 / 0 |
