QMediaplayer se transmite desde un dispositivo QIOD personalizado con cifrado en Mac OS (10.9)

Actualmente estoy portando una aplicación de Qt4 (.8.4) a Qt5 (.2.0). Casi he terminado con todos los cambios conocidos, como la función obsoleta aAscii (), falta QtGui y así sucesivamente. Ahora teníamos un reproductor de música que usa el marco de phonon que ya no es compatible y fue reemplazado por el módulo QtMultimedia, que incluye QMediaPlayer y un montón de clases de manejo de audio.

Nuestra implementación del reproductor requiere un dispositivo QIOD personalizado. Este dispositivo proporciona una interfaz para archivos de audio encriptados en el disco. Ahora el jugador le pide al dispositivo x bytes, el dispositivo lee el archivo cifrado, descifra los bytes que el jugador pidió y los devuelve.

Ahora busqué una función en el módulo multimedia para reutilizar mi dispositivo IOD y encontré la siguiente función:

void setMedia(const QMediaContent & media, QIODevice * stream = 0)

y lo usé de la siguiente manera:

m_pDecryptingMediaDevice = new BYIODevice(filename);    
m_pDecryptingMediaDevice->open(QIODevice::ReadOnly);    
m_pPlayer->setMedia(0, m_pDecryptingMediaDevice);

donde m_pDecryptingMediaDevice es la subclase de QIODevice y m_pPlayer el QMediaPlayer.

Ahora en Windows todo funciona como se espera. El QMediaplayer cambia su MediaStatus a QMediaPlayer :: LoadingMedia y solicita bytes a mi dispositivo. Luego, cambia a QMediaPlayer :: State PlayingState y el estado se establece en BufferedMedia. Todo está bien. Desgraciadamente en Mac OS (10.9.1) Solo obtengo QMediaPlayer :: PlayingState y nada más. El reproductor / audiobackend nunca solicita bytes a mi dispositivo y no llama a ninguna otra función. No creo que el error esté relacionado con el dispositivo QIOD personalizado, sino en la forma en que se le da al QMediaPlayer porque el jugador ni siquiera solicita bytes ni llama a ninguna función en el dispositivo.

Solo intenté descomponerlo en un pequeño proyecto de prueba:

QMediaPlayer *player = new QMediaPlayer(this);
QFile *music = new QFile("C:/Users/.../Music/Test.mp3");
music->open(QIODevice::ReadOnly);
player->setMedia(0, music);
connect(ui->pushButton, SIGNAL(clicked()), player, SLOT(play()));
connect(player, SIGNAL(stateChanged(QMediaPlayer::State)), this, SLOT(stateChanged(QMediaPlayer::State)));

Curiosamente, esto no funciona en absoluto, no en Windows, no en Mac OS. Lo que siempre funciona es dar una URL al jugador como

¿Alguien tiene experiencia en un caso similar según la transmisión de un dispositivo QIOD a QMediaPlayer mediante la función setMedia (const QMediaContent & media, QIODevice * stream = 0)? Estoy atascado con esto.

Saludos cordiales y muchas gracias de antemano.

ene

Respuestas a la pregunta(2)

Su respuesta a la pregunta