Привет всем! Помогите, кто связывался с waveOutGetPosition. Проблема следущая:
вызываю сабж так:
waveOutGetPosition(m_hWaveOut, &m_CurrTime, sizeof(m_CurrTime));
wType перед этим заполняется как
m_CurrTime.wType = TIME_SAMPLES;
Всё идёт гладко, но до поры, до времени. А именно: когда возвращаемое значение переваливает за 0x8000000, счётчик обнуляется и начинает снова инкрементироваться. Вопрос:
а) почему именно на этом значении идёт обнуление
б) всегда ли предел будет таким?
Проверял на двух машинах с XP, на трёх звуковухах. везде одинаково. Но сомневаюсь, что так будет всегда. Кто что знает по этому поводу?
ЗЫЖ гуглил, MSDN читал. Нигде ничего вразумительного не нашёл
[Ответ]
Before calling this function, set the wType member of the MMTIME structure to indicate the time format you want. After calling this function, check wType to determine whether the time format is supported. If the format is not supported, wType will specify an alternative format.
The position is set to zero when the device is opened or reset.
А докажи =) И заодно, что оно TIME_SAMPLES принимает... и операционку... а то ща окажется, что оно у тебя под вайном не работает... =)
[Ответ]
MHC 01:07 04.08.2008
dn2k4, я не просвящен.. а чё такое "вайн"? TIME_SAMPLES принимает -- гарантирую. Ибо всё зашибись принимает. В другом вопрос был: почему именно на 0x8000000 обнуляется счётчик и какого Х. об этом ни слова в MSDN я не нашёл? Или, может, это всё зависит уже от конкретной железки?
[Ответ]
MHC 01:20 04.08.2008
Part!zan, выкладываю класс. Хотя... Врядли, что изменится. Каким он был -- таким он и остался
ЗЫЖ на каменты в коде не обращайте внимания. Были написаны в начальной стадии разработки. Сейчас уже конечная.. С ворнингами разберусь, обдокументирую всё и отправлю заказчику...
Повторюсь, реально TIME_SAMPLES юзается, реально на моих звуковушках обнуляется счётчик после 0x8000000. В данной, выложенной версии, кста, уже корректировка позиции буффера присутствует (в самой нижней функции). Просто я не уверен, что она будет чётко работать на всех девайсах...
Изображения
MHC, а в файле вообще есть столько сэмплов? Какая частота дискретизации? Кстати, возвращаемый wType ты не проверяешь, несмотря на рекомендации в мсдн... А так, вроде ниче криминального, относительно waveOutGetPosition, не видно...
[Ответ]
Part!zan, это был костыль. сейчас данные стабильно приходят из сети. (см., там return стоит)
частота в данном примере 48 KHz.
Под дебагером раньше проверял -- TIME_SAMPLES приходит.
Вообще всё работает нормально. И обнуление -- это логично. Единственная загвоздка -- почему оно обнуляется именно на таком пределе?
[Ответ]
Part!zan 12:54 04.08.2008
Сообщение от MHC:
данные стабильно приходят из сети
То есть это поток? О каком вообще позишине тогда может идти речь?
Сообщение от MHC:
обнуление -- это логично
Ну, раз так, то поясни логику ))) Вот если бы оно на 0х80000000 обнулялось, хоть какая-то логика была бы, а так - нипанятна.
[Ответ]
MHC 13:11 04.08.2008
Part!zan, если коротко -- ситуация такова:
есть два буфера на вывод звука. Попеременно, один за другим, подсовываются звуковухе. Заполняются они из другого места, данные из сети берутся. Но, в принципе, где и чем заполняются -- не важно. Т.к буферы проигрываются даже тогда, когда не заполнены. Т.е "тишина проигрывается". А о позишине воспроизводимого звука как раз и идёт речь. Я сначала думал, что будет возвращаться относительно начала текущего буфера -- хрена с два там. Сквозная позиция идёт. Постоянно инкрементируется. По поводу логики: я имею ввиду, что вообще логично обнулять когда-нить. Но на 0x8000000, ессно, как-то нелогично. Для меня, по крайней мере. Кстати, попробовал ща на 24 KHz -- тоже самое, на 0x8000000 обнулилось. Ждать, правда, пришлось два раза по 46.5 минут [Ответ]
Part!zan 16:55 04.08.2008
MHC, а что возвращает waveOutGetPosition после обнуления? Кстати, а в других единицах тоже обнуляется? А чтобы долго не ждать, можно частоту дискретизации задрать до максимума...
[Ответ]
MHC 17:10 04.08.2008
Сообщение от Part!zan: MHC, а что возвращает waveOutGetPosition после обнуления?
Если на шаге "i-1", например, возвращалось 0x7ff ff00, то на шаге "i" возвращается, к примеру, 0x0000ae0
Сообщение от Part!zan:
Кстати, а в других единицах тоже обнуляется?
не пробовал и сейчас, к сожалению, нет возможности проверить. Парюсь с вистой.. Заказчик попросил поддержку висты Эх..
[Ответ]
Part!zan 19:49 04.08.2008
Сообщение от MHC:
Если на шаге "i-1"
Я имею ввиду, че сама функция возвращает, что все ОК?
[Ответ]
MHC 21:19 04.08.2008
Сообщение от Part!zan:
Я имею ввиду, че сама функция возвращает, что все ОК?
да, сама функция возвращает MMSYSERR_NOERROR. Здесь всё нормально
[Ответ]
cfyx 08:30 05.08.2008
паришсо, Ден? )) заведи себе счетчик, в который складывай инкременты от waveOutGetPosition c i-1 до i, сделай его Int64 и пофиг тебе будет на обнуление. )
[Ответ]
MHC 11:25 05.08.2008
Сообщение от cfyx:
паришсо, Ден? )) заведи себе счетчик, в который складывай инкременты от waveOutGetPosition c i-1 до i, сделай его Int64 и пофиг тебе будет на обнуление. )
Саш, а зачем так много, 64? у меня если шифт больше размера буффера -- то делается обрезание методом %= и всё гуд. Но эт всё мелочи. А вот как определить, где шаг i, а где шаг i-1 -- до сих пор для меня является проблемой. сейчас костыль стоит, но будет ли он работать везде или нет -- ХЗ.
MHC, ты б все-таки попробовал в других единицах. У мелкософта в примерах байты запрашиваются...
[Ответ]
MHC 15:26 05.08.2008
Part!zan, пока оставлю так. Ибо даже на висте срабатывает также. Если после проблемы появятся -- тогда прийдется менять на байты. А пока -- всем спасибо за советы!
[Ответ]