![]() |
|
Модераторы: Rickert, Alexeis, BorisVorontsov |
![]()
|
|
| batraq |
|
||||
|
Новичок Профиль Группа: Участник Сообщений: 43 Регистрация: 12.4.2007 Репутация: нет Всего: нет |
День добрый,
Есть вопрос - взялся воспроизводить звук под WinCE на основе книжки "Программирование звука в Windows" Олег Гордеев. Сама прога компилиться отлично, единственная проблема не проигрывается звук, почему-то не срабатывает WaitForSingleObject(). Данные из файла читаются, все хэндлы тоже выглядят правильно.
Как я понимаю все библиотеки еть в наличии, существует другой плеер который проигрывает этот же не сжатый wav на этом же девайсе. Мало того эта прога скомпилёная под WinXP отлично проигрывает. На девайсе не хочет и все - срабатывает exception
Может кто подскажет в чём тонкость |
||||
|
|||||
| Alexeis |
|
|||
![]() Амеба Профиль Группа: Админ Сообщений: 11743 Регистрация: 12.10.2005 Где: Зеленоград Репутация: 5 Всего: 459 |
Может у него свой кодек для распаковки? Добавлено через 58 секунд Стоит проверить результаты которые возвращают функции, возможно одна из них завершается с ошибкой. -------------------- Vit вечная память. Обсуждение действий администрации форума производятся только в этом форуме гениальность идеи состоит в том, что ее невозможно придумать |
|||
|
||||
| batraq |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 43 Регистрация: 12.4.2007 Репутация: нет Всего: нет |
Нет кодек тут ни при чём, все данные я сам читаю из файла через fopen(). А потом все wav файлы не сжаты.
|
|||
|
||||
| Alexeis |
|
|||
![]() Амеба Профиль Группа: Админ Сообщений: 11743 Регистрация: 12.10.2005 Где: Зеленоград Репутация: 5 Всего: 459 |
Это совсем не гарантия работы, например у меня встроенный аудиокодек, который понимает только a-low, PCM формат не переваривает. Проверяйте результат который возвращает каждая функция waveOut* . Если что-то не поддерживается, то функция вернет ошибку, дальше по коду ошибки смотрим описание. WinCE это не Windows XP, в нем многое упрощено и часть обычных функций не поддерживается. Добавлено через 4 минуты и 45 секунд Вообще не понимаю как у вас работает функция CreateFile.
В Windows CE нет функции CreateFileA, только CreateFileW. И вообще отсутствуют API функции работающие с Ansi строками, разве что только конвертирование. Проблема может быть связанна именно с этим. -------------------- Vit вечная память. Обсуждение действий администрации форума производятся только в этом форуме гениальность идеи состоит в том, что ее невозможно придумать |
|||
|
||||
| batraq |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 43 Регистрация: 12.4.2007 Репутация: нет Всего: нет |
Попробую продебажить как ты предложил с просмотром кодов возврата. Вроде смотрел и поддержка PCM присутствует. Что до CreateFile() то у меня не совсем обычная сборка WinCE, там много чего есть помимо обычного набора с заточкой под ARM железо.
|
|||
|
||||
| Alexeis |
|
|||
![]() Амеба Профиль Группа: Админ Сообщений: 11743 Регистрация: 12.10.2005 Где: Зеленоград Репутация: 5 Всего: 459 |
Гм... сборки CE, они все разные, но не слышал про ядро которое бы поддерживало ANSI. У меня в SDK стоит дефайн тупо объявляющий что CreateFile это CreateFileW, но мало ли что народ придумает, конечно могут быть и сторонние компоненты, но использование ansi функций уже в NT было неразумным, поскольку всегда посходило конвертирование родной для ядра юникод. В CE же где размер и скорость имеет значение тем более нет смысла работать через промежуточный ansi. Сейчас принято так, работаем с utf16, храним в utf8 или utf8 пожатое zlib. И ни каких проблем с кодировками. -------------------- Vit вечная память. Обсуждение действий администрации форума производятся только в этом форуме гениальность идеи состоит в том, что ее невозможно придумать |
|||
|
||||
| batraq |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 43 Регистрация: 12.4.2007 Репутация: нет Всего: нет |
Вот продебажил код выяснил что на последнем этапе вызов waveOutOpen() возвращает код ошибки 11 - invalid parameter passed. А вот какой параемтр кривой не пойму.
Кроме того просмотрел параметры звукового девайса. Вот они:
Больше всего меня смутил параметр dwFormats равный волшебному 0xFFF. Там всего-то ключей существует до 0х3FF. Как такой параметр получился ума не приложу. Кроме этого девайсов по воспроизведению нет в системе больше. Встаёт вопрос если один параметр(wChannels) говорит что поддерживает только mono, то почему dwFormats говорит что может всё? Может кто подскажет в чём засада |
|||
|
||||
| batraq |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 43 Регистрация: 12.4.2007 Репутация: нет Всего: нет |
Вдумчиво покурив MSDN выяснил как проверить поддерживает железка формат файла или нет вот так вот делается
Если res=0 то всё отлично и можем проиграть, иначе формат не поддерживается. Так что проблема точно не в формате файла(а жаль, так было бы проше) |
|||
|
||||
| Alexeis |
|
|||
![]() Амеба Профиль Группа: Админ Сообщений: 11743 Регистрация: 12.10.2005 Где: Зеленоград Репутация: 5 Всего: 459 |
Может не умеет работать с CALLBACK_EVENT ?
-------------------- Vit вечная память. Обсуждение действий администрации форума производятся только в этом форуме гениальность идеи состоит в том, что ее невозможно придумать |
|||
|
||||
| batraq |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 43 Регистрация: 12.4.2007 Репутация: нет Всего: нет |
Нашёл небольшую неточность при чтении формата файла. Похоже что в файле хранится не WAVEFORMATEX а PCMWAVEFORMAT. Т.е. более старая форма записи. Но это никак не повлияло на проблему. Думаешь не умеет с событиями работать, ладно поробую переписать на CALLBACK функцию
|
|||
|
||||
| batraq |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 43 Регистрация: 12.4.2007 Репутация: нет Всего: нет |
Короче вот код который собирается как под Win32 так и под WinCE. Остаётся понять почему в самый главный момент, а именно при вызове waveOutWrite() она возвращает значение 11 что расшифровывается как не верный параметр. Данные целые и загружены корректно, хэндлы тоже вроде как верные. Девайс в системе есть и находится, а играть не хочет.
Я в тупике, нужны мысли, кто сталкивался. Переписывание на CALLBACK функцию ничего не дало. Готов почти отчаяться и впасть в уныние |
|||
|
||||
| batraq |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 43 Регистрация: 12.4.2007 Репутация: нет Всего: нет |
Ларчик просто открывался. А всё потому что память которую я выделяю уничтожает waveOutUnprepareHeader(). Не обратил внимания на то, что в примере из книжки данные копировались из массива прочитанного в буфер WAVEHDR. Вот верный код
И как выяснилось крыша едет у WindowsCE, в то время как на PC всё хорошо |
|||
|
||||
![]()
|
| Вы можете найти полезным что... | |
|
|
|
| 1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Мультимедия, OpenGL/DirectX | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |