суббота, 5 сентября 2009 г.

Сложный результат интерференции нескольких багов

Когда телефон лежит в кармане, а я с него слушаю музыку - он моргает подсветкой при смене треков в плеере. Во-первых, мне это не нравится, во-вторый - это совершенно лишний раз жрет батарейку.

Первое и самое интересное - почему подсветка вообще дергается при смене трека? Потомучто есть такая штука, как power constraints, которая регулирует, насколько далеко устройству можно уходить в сберегающих режимах. Вполне естественно, что телефон не может играть музыку, когда он находится в слипе.

Исходя из этого здравого рассуждения, медиасервер запрещает уходить в слип, когда проигрывает что-то. Когда проигрываение останавливается, плеер снимает разрешение.

И тут закрадываются внеземная логика работников тролльтех: при смене power constraint, нужно включить подсветку. При чем это делает кто-то аж изнутри QtGui, а код там загадочен.

Делаю ход конем: режим меняется не тогда, когда меняется состояние плеера "играю-неиграю", а через две секунды. Проверяю: не работает. То есть работает, но подсветка все равно мигает на смене трека. Для проверки, убираю из медиасервера управление питанием - моргает. Магия... Стоп, магии же не бывает.

Смотрю код медиадвижка, благо багов там обычно есть: он питание вообще не трогает. Смотрю код плеера и вижу чудеса: плеер запрещает выключать подсветку, когда проигрывает видео. Это меня не касается - видео я не смотрю. Для проверки, убираю из плеера код управление питанием - не моргает. Оппа, "связистор опять выловил что-то за хвост из болота", как сказал тридемоделятор azcapone.

Судя по коду, в плеере есть некий "медиавиджет", который создается при наличии видео. Если виджет есть - питание трогаем, если нету - не трогаем. Но виджета же нету, почему тогда мограет? Нахожу замечательный факт:


notifier = new QMediaControlNotifier( QMediaVideoControl::name(), this );

connect( notifier, SIGNAL(valid()), this, SLOT(activateVideo()) );
connect( notifier, SIGNAL(invalid()), this, SLOT(deactivateVideo()) );


при чем в deactivateVideo() дергается управление питанием без проверки виджета.

Опять патч в одну строку, а началось все с того, что я хотел замерить, сколько телефон живет от одного заряда батареи.

2 комментария:

  1. Я, так понимаю, ноги у 2.6.* ядра для минга, растут примерно тоже оттуда? Типа, автор захотел sdhc пощЩюпать?

    ОтветитьУдалить
  2. >ноги у 2.6.* ядра для минга, растут примерно тоже оттуда? Типа, автор захотел sdhc пощЩюпать?

    нет

    ОтветитьУдалить