|
|
Регистрация Восстановить пароль |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
|
Опции темы | Поиск в этой теме |
11.05.2012, 21:39 | #1 |
Форумчанин
Регистрация: 07.04.2009
Сообщений: 112
|
проблема с выводом звука определенной частоты в короткие промежутки времени.
Ребят такая проблема.. нужно вывести на колонки звуковые отрывки частотой к примеру 1000Hz длительностью 30-100 МСек и между звуками паузу такой же длительности. Не могу найти достаточно быстрый способ для этого (дело в том, что на слабеньких компьютерах (либо на загруженных процессами) иногда идет залипание звучания). Пока что самого более менее подходящего звучания добился с помощью компонента TGen, причем только при установке Duration(длительности звучания) и команды Gen1.Play (Без Gen1.Stop) а между звуками и на время звучания TGen(так как синтез звука идет потоком) использовал наиболее точную (по тестам) паузу приведенную в коде
Код:
Есть какие нибудь предложения как ускорить этот процесс? |
11.05.2012, 22:18 | #2 |
Старожил
Регистрация: 08.04.2012
Сообщений: 3,229
|
Первое впечатление - Вы подходите к генерации звука совершенно не с тех позиций, с которых принято, а потому Ваша программа требует себе 100% процессорного времени и не сможет нормально функционировать в многозадачной ОС.
Так что нужно не думать, как ускорить процесс, а почитать об основах синтеза звука на архитектуре IBM PC. |
11.05.2012, 22:47 | #3 |
Форумчанин
Регистрация: 07.04.2009
Сообщений: 112
|
ну в принципе другого ответа я и не ожидал) от подобных форумов всегда мало толку) спс за то что хоть отвечаете))
|
11.05.2012, 22:53 | #4 |
Старожил
Регистрация: 28.01.2009
Сообщений: 21,000
|
вам ответили верно.
лучше генерировать звук с запасом некоторым, а не на сейчас. Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел. Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите. |
11.05.2012, 23:19 | #5 |
Старожил
Регистрация: 08.04.2012
Сообщений: 3,229
|
А чего Вы ждали, задавая вопрос и приводя в качестве примера фрагмент, который НЕ ГЕНЕРИРУЕТ звук?
А соображение, что Вы копаете не в ту сторону у меня появились оттого, что QueryPerformanceFrequency/QueryPerformanceCounter к генерации звука не относится и при такой генерации не используется. Если Вы пытаетесь его применить, то что-то делаете не так. Если хотите получить совет, который хоть с какой-то вероятностью может оказаться полезным, расскажите подробнее, каким методом Вы генерируете звук. |
11.05.2012, 23:38 | #6 |
Форумчанин
Регистрация: 07.04.2009
Сообщений: 112
|
смысл в том чтоб вывести звуковой сигнал длительностью ровно 30 Мсек с минимальной погрешностью.
ну и еще одновременно отобразить за время пищания например картинку. а код который я привел это код наиболее точнейшей паузы если вы внимательно читали. Генерировал сигнал компонентом TGen потому что подобные этому ( Код:
Меня интересует реально ли вообще такое сделать или не стоит мудрить?) Последний раз редактировалось Stilet; 12.05.2012 в 08:10. |
11.05.2012, 23:48 | #7 |
Старожил
Регистрация: 03.01.2011
Сообщений: 2,508
|
Вместо никому не нужной паузы, просто отсчитывайте число сэмплов. Например, для частоты оцифровки 44100Hz, 30 мс сигнала соответсвуют 1323 семплам. Вот их и посылайте на колонки. Будет ровно 30 мс звука со 100% точностью на любом процессоре.
> с данной задачей совсем не справляются. Ну так вместо убитой sndPlaySound() надо пользоваться WaveOutOpen(), waveOutWrite() и далее по тексту.
"Когда приходит положенное время, человек перестаёт играть в пинбол. Только и всего."
Последний раз редактировалось veniside; 11.05.2012 в 23:55. |
12.05.2012, 07:46 | #8 | ||
Старожил
Регистрация: 08.04.2012
Сообщений: 3,229
|
Цитата:
Цитата:
Паузы формируются непосредственно в звуковом буфере. Т.е. звуковой буфер состоит из участков с синусоидой (звук) и с прямой линией (пауза) и при этом непрерывно проигрывается. Кстати, если Вам непременно нужна минимальная погрешность, лучше разрядность звука выбирать равной 16, а частоту дискретизации - повыше, например, 48000 Гц. |
||
12.05.2012, 20:24 | #9 |
Форумчанин
Регистрация: 07.04.2009
Сообщений: 112
|
Можешь пример привести где так вот с количеством сэмплов работать можно? А то чтото не получается у меня... Могу сделать только так - нажимаешь - играет.. нажимаешь на стоп - прекращает.. не соображу как с помощью количества сэмплов длительность внедрить. по этому то собственно и пользовался процедурой паузы.. Кстати если можно то вывод звука без использования потоков надо...
Последний раз редактировалось JekaDefer; 12.05.2012 в 20:28. |
12.05.2012, 21:15 | #10 |
Старожил
Регистрация: 08.04.2012
Сообщений: 3,229
|
Вывод звука с использованием потоков - это правильно, и не нужно этого бояться.
Нарисуйте, что хотите получить, на бумаге. Ну, например, в масштабе 1 мс = 5 см. Тогда в 5 см у Вас будет укладываться 1 период синусоиды. А 30-мс фрагмент - 30 периодов, укладывающихся в 1.5 метра. 30 мс пауза - те же полтора метра, только не синусоиды, а прямой. Собственно, Вам нужно этот "рисунок" поместить в буфер. Но сначала провести дискретизацию с частотой, скажем, 48 кГц. Т.е. 48 отсчетов на 1 мс. Другими словами, через интервалы 50/48 ~ 1 мм на бумаге. Можете нарисовать эти точки. Надеюсь, после того, как Вы их нарисуете или, хотя бы, мысленно представите, будет гораздо проще понять, как формировать звуковой буфер. Если использовать не 48, а, как Вы планировали, 11.025 кГц, то точки дискретизации нужно ставить примерно через 4.5 мм. Последний раз редактировалось s-andriano; 12.05.2012 в 21:18. |
|
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Проблема с выводом времени работы программы | murzilka6002 | Общие вопросы C/C++ | 0 | 13.12.2011 23:17 |
Нужно разобраться с выводом текущего времени | ExDeGarse | Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM | 1 | 21.06.2011 15:52 |
проблема с выводом | -=Andriushka=- | Помощь студентам | 0 | 13.04.2011 21:46 |
Программа для воспроизведения тонового звука через промежуток времени | Vl-sn | Помощь студентам | 9 | 12.03.2010 20:27 |
Промежутки времени | SatiriK(rus) | SQL, базы данных | 4 | 19.11.2008 00:37 |