crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

 
Ответить в данную темуНачать новую тему
> Не переопределяется QIODevice::isOpen(), При использовании для Phonon
kerdster
  опции профиля:
сообщение 7.7.2011, 13:17
Сообщение #1


Студент
*

Группа: Новичок
Сообщений: 11
Регистрация: 1.2.2009
Пользователь №: 520

Спасибо сказали: 0 раз(а)




Репутация:   0  


Добрый день.
Проблема состоит в следующем - необходимо сделать производный класс от QIODevice для использования его в Phonon.
Всё бы хорошо, но столкнулся со странной проблемой - не удаётся переопределить в производном классе метод isOpen().

Объявление:
class netSource : public QIODevice
{
Q_OBJECT
public:
    explicit netSource(QObject *parent = 0);
    bool isOpen() const;
    ....
}


Определение:
bool netSource::isOpen() const
{
    qDebug() << "SRC: is Open";
    return true;
}


Пример кода:
netSource *src = new netSource(this);
    
src->isOpen(); // Работает!

Phonon::MediaObject *mediaObject = new Phonon::MediaObject(this);
mediaObject->setCurrentSource(Phonon::MediaSource(src)); // Падение! ASSERT: "ioDevice->isOpen()" in file /builddir/build/BUILD/phonon-4.4.3/phonon/iodevicestream.cpp, line 43


Там, где срабатывает ASSERT моя функция НЕ вызывается, в первом случае вывод в дебаг есть, а во втором нет.

Что за фигня такая странная? Исходники проекта прикрепил.
Прикрепленные файлы
Прикрепленный файл  phonon_net.zip ( 3.24 килобайт ) Кол-во скачиваний: 47
 
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
RazrFalcon
  опции профиля:
сообщение 7.7.2011, 15:48
Сообщение #2


Zombie Mod
*****

Группа: Участник
Сообщений: 1654
Регистрация: 24.5.2010
Из: Харьков
Пользователь №: 1752

Спасибо сказали: 64 раз(а)




Репутация:   212  


Не совсем понял в чем проблема, но у меня не падает. <_<

Лог:
Раскрывающийся текст
Start play:  "ololol" 
SRC: is Open
NS: Open!
NS: Seek:  0
WARNING: Phonon needs QCoreApplication::applicationName to be set to export audio output names through the DBUS interface
QP_LOGGER /tmp/yaourt-tmp-razrfalcon/aur-phonon-mplayer-git/src/phonon-mplayer/mplayer/MediaController.cpp 355 Phonon-MPlayer subtitleAdded
QP_LOGGER /tmp/yaourt-tmp-razrfalcon/aur-phonon-mplayer-git/src/phonon-mplayer/mplayer/MediaController.cpp 394 Phonon-MPlayer subtitleChanged New current subtitle: "None"
socket(): Address family not supported by protocol
QP_LOGGER /tmp/yaourt-tmp-razrfalcon/aur-phonon-mplayer-git/src/phonon-mplayer/mplayer/Backend.cpp 180 Phonon-MPlayer objectDescriptionIndexes
QP_LOGGER /tmp/yaourt-tmp-razrfalcon/aur-phonon-mplayer-git/src/phonon-mplayer/mplayer/Backend.cpp 212 Phonon-MPlayer objectDescriptionProperties
QP_LOGGER /tmp/yaourt-tmp-razrfalcon/aur-phonon-mplayer-git/src/phonon-mplayer/mplayer/Backend.cpp 256 Phonon-MPlayer startConnectionChange
QP_LOGGER /tmp/yaourt-tmp-razrfalcon/aur-phonon-mplayer-git/src/phonon-mplayer/mplayer/Backend.cpp 258 Phonon-MPlayer startConnectionChange Node: Phonon::MPlayer::AudioOutput
QP_LOGGER /tmp/yaourt-tmp-razrfalcon/aur-phonon-mplayer-git/src/phonon-mplayer/mplayer/Backend.cpp 258 Phonon-MPlayer startConnectionChange Node: Phonon::MPlayer::MediaObject
QP_LOGGER /tmp/yaourt-tmp-razrfalcon/aur-phonon-mplayer-git/src/phonon-mplayer/mplayer/Backend.cpp 268 Phonon-MPlayer connectNodes Phonon::MPlayer::MediaObject Phonon::MPlayer::AudioOutput
QP_LOGGER /tmp/yaourt-tmp-razrfalcon/aur-phonon-mplayer-git/src/phonon-mplayer/mplayer/Backend.cpp 329 Phonon-MPlayer endConnectionChange
QP_LOGGER /tmp/yaourt-tmp-razrfalcon/aur-phonon-mplayer-git/src/phonon-mplayer/mplayer/Backend.cpp 331 Phonon-MPlayer endConnectionChange Node: Phonon::MPlayer::AudioOutput
QP_LOGGER /tmp/yaourt-tmp-razrfalcon/aur-phonon-mplayer-git/src/phonon-mplayer/mplayer/Backend.cpp 331 Phonon-MPlayer endConnectionChange Node: Phonon::MPlayer::MediaObject


Сообщение отредактировал RazrFalcon - 7.7.2011, 15:51
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
kerdster
  опции профиля:
сообщение 7.7.2011, 21:14
Сообщение #3


Студент
*

Группа: Новичок
Сообщений: 11
Регистрация: 1.2.2009
Пользователь №: 520

Спасибо сказали: 0 раз(а)




Репутация:   0  


Цитата(RazrFalcon @ 7.7.2011, 16:48) *
Не совсем понял в чем проблема, но у меня не падает. <_<

Думал проблема действительно в каком-то баге, но на другой машине проблема осталась та же:
$ out/phonon-net 
Start play:  "ololol"
SRC: is Open
NS: Open!
ASSERT: "ioDevice->isOpen()" in file /builddir/build/BUILD/phonon-4.5.0/phonon/iodevicestream.cpp, line 43
Аварийный останов (core dumped)


Смотрел в код, указанный в сообщении ACCERT, и там совершенно честно:
Q_ACCERT(ioDevice->isOpen())

Что очень странно, ведь у меня она возвращает true. Я вот не могу понять, может с переопределением в наследовании накосячил?

Собиралось и запускалось всё добро на Qt 4.6.3/Fedora 13 и Qt 4.7.2/Fedora 14, обе 32х битные.

З.Ы. - У вас почему-то нет вывода в Debug второй раз сообщения "SRC: is Open", хотя он должен быть (см. в ошибке: /phonon/iodevicestream.cpp, line 43).
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
RazrFalcon
  опции профиля:
сообщение 7.7.2011, 21:25
Сообщение #4


Zombie Mod
*****

Группа: Участник
Сообщений: 1654
Регистрация: 24.5.2010
Из: Харьков
Пользователь №: 1752

Спасибо сказали: 64 раз(а)




Репутация:   212  


У меня х32 Arch

В остальном: без понятия, так как не могу повторить багу.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
kerdster
  опции профиля:
сообщение 8.7.2011, 9:29
Сообщение #5


Студент
*

Группа: Новичок
Сообщений: 11
Регистрация: 1.2.2009
Пользователь №: 520

Спасибо сказали: 0 раз(а)




Репутация:   0  


Уф, разобрался в чём дело.
Проглядел что в документации функция isOpen() не виртуальная в классе QIODevice, следовательно при передаче в phonon вызывалась функция базового класса. В документации написано:
Цитата
Returns true if the device is open; otherwise returns false. A device is open if it can be read from and/or written to. By default, this function returns false if openMode() returns NotOpen.

Следовательно добавил в свой класс просто:
bool netSource::open(OpenMode mode)
{
    qDebug() << "NS: Open!";
    this->is_opened = true;
    [b]this->setOpenMode(mode);[/b]
    return true;
}

И вуаля! Спасибо за внимание и желание помочь))
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 29.10.2020, 2:10