Описываю медиа-объект:
Phonon::MediaObject *m_pLevelSound; //Обект для проигрывания звука уровня
m_pLevelSound = new Phonon::MediaObject(this);
Phonon::AudioOutput *audioOutput2 = new Phonon::AudioOutput(Phonon::MusicCategory, this);
Phonon::createPath(m_pLevelSound, audioOutput2);
m_pLevelSound->setCurrentSource(Phonon::MediaSource(QString::fromLocal8Bit("/music/noise.wav")));
m_pLevelSound->play();
Уточняю информацию - у меня могут проигрываться 2 звука одновременно. Первый проигрывается периодически (в моменты обнаружения радио-меток, это может произойти в любой момент), второй - только по нажатию на одну кнопку. Таким образом, возможно одновременное проигрыание двух звуков.
Инициализация медиа-объектов:
m_pSound = new Phonon::MediaObject(this);
Phonon::AudioOutput *audioOutput1 = new Phonon::AudioOutput(Phonon::MusicCategory, this);
Phonon::createPath(m_pSound, audioOutput1);
m_pLevelSound = new Phonon::MediaObject(this);
Phonon::AudioOutput *audioOutput2 = new Phonon::AudioOutput(Phonon::MusicCategory, this);
Phonon::createPath(m_pLevelSound, audioOutput2);
if(m_pSound->state() != Phonon::PlayingState)
{
m_pSound->setCurrentSource(Phonon::MediaSource("/music/tada.wav"));
m_pSound->play();
}
m_pLevelSound->setCurrentSource(Phonon::MediaSource("/music/noise.wav"));
m_pLevelSound->play();
if(m_pSound->state() != Phonon::PlayingState)
{
//m_pSound->setCurrentSource(Phonon::MediaSource("/music/tada.wav"));
//m_pSound->play();
}
И все-таки даже когда только 1 медиа-объект - все равно глючит...
чет мне кажется, что зря ты каждый раз при плее задаешь медиа сорс - скорее всего у тебя оперативка вся забивается после нескольких раз, т.к. сорс открывается заново, а старый - засчет path'а еще жив.
Задавай медиа сорс один раз, потом плей. При окончании проигрывания, откатывай на ноль (тупо стоп к примеру или seek(0)), и далее плей отлично заново идет.
Да твой вариант работает. Только как быть если мне в различных ситуациях надо проигрывать до 15-ти аудиофайлов? Создавать массив из 15 медиаобъектов, каждому 1 раз задавать сорс, соединять их с 15-ю аудиоаутпутами...? И следить чтобы все это одновременно не проигрывалось?
Я сделал так, но при этом перестал работать дополнительный поток, который никак со звуком не связан. В общем пока какие-то неразрешимые проблемы с фононом.
Может все-таки посоветуешь другую кроссплатформенную библиотеку чтобы Win CE поддерживала?
Другую никакую не посоветую, ибо поверь мне, там ты наимеешься еще больше, я прежде чем стал юзать фонон очень на многое ругался Можешь напрямую DirectShow юзать как вариант, но кроссплатформенно, для винце - фонон. FFMpeg крут, но его собирать... ))
Если перестал работать доп. поток, ищи проблему в другом. К примеру, память. Или еще что.
В случае 15 файлов - останавливай, выгружай, загружай новый файл. А ты просто не выгружал предыдущий файл.
Плюнул на Phonon и написал свой маленький класс. Главное что мне было нужно, кроме проигрывания - индикация завершения проигрывания:
Файл csound.h:
#ifndef CSOUND_H
#define CSOUND_H
#include <QThread>
#include <Windows.h>
#include <QMutex>
class CSound : public QThread
{
Q_OBJECT
public:
CSound(QObject *parent);
~CSound();
void run();
void setSound(const QString &fileName);
void play(){m_isPlaying = true; start();};
bool isPlaying(){return m_isPlaying;};
private:
QString m_soundFile;
QMutex m_mutex;
bool m_isPlaying;
signals:
void finished();
};
#endif // CSOUND_H
#include "csound.h"
#pragma comment(lib, "winmm.lib")
#include <QMutexLocker>
CSound::CSound(QObject *parent)
: QThread(parent),
m_isPlaying(false)
{
}
CSound::~CSound()
{
}
void CSound::setSound( const QString &fileName )
{
QMutexLocker locker(&m_mutex);
m_soundFile = fileName;
}
void CSound::run()
{
QMutexLocker locker(&m_mutex);
LPCWSTR wSoundName = m_soundFile.utf16();
PlaySound(wSoundName, NULL, SND_SYNC | SND_NODEFAULT);
m_isPlaying = false;
emit finished();
}
вавки вопроизводить кстати не лучшая идея для бедных винце
а так - с фононом все ок, если что-то не ок, то проблема в логике
Ты не поменял логику использования, т.е. "интерфейс", но логика внутренняя в целом поменялась
Форум Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)