Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум на CrossPlatform.RU _ Qt Мультимедиа _ почему звук проигрывается не всегда?

Автор: mezmay 22.3.2011, 14:07

Описываю медиа-объект:

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();


По нажатию на кнопку нужный зук поначалу прогирывается, но через некотрое время по нажатию на кнопку звук перестает проигрываться. Почему??

p.s. все это на windows mobile 6.1 professional. Qt 4.6.1

Автор: mezmay 23.3.2011, 11:42

Уточняю информацию - у меня могут проигрываться 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. Я неправильно работаю с медиа-объектами (в чем ошибка?)
2. Глючит Phonon...

Автор: mezmay 23.3.2011, 17:18

И все-таки даже когда только 1 медиа-объект - все равно глючит...

Автор: ufna 23.3.2011, 17:59

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

Задавай медиа сорс один раз, потом плей. При окончании проигрывания, откатывай на ноль (тупо стоп к примеру или seek(0)), и далее плей отлично заново идет.

Автор: mezmay 24.3.2011, 12:08

Да твой вариант работает. Только как быть если мне в различных ситуациях надо проигрывать до 15-ти аудиофайлов? Создавать массив из 15 медиаобъектов, каждому 1 раз задавать сорс, соединять их с 15-ю аудиоаутпутами...? И следить чтобы все это одновременно не проигрывалось?
Я сделал так, но при этом перестал работать дополнительный поток, который никак со звуком не связан. В общем пока какие-то неразрешимые проблемы с фононом.
Может все-таки посоветуешь другую кроссплатформенную библиотеку чтобы Win CE поддерживала?

Автор: ufna 24.3.2011, 15:02

Другую никакую не посоветую, ибо поверь мне, там ты наимеешься еще больше, я прежде чем стал юзать фонон очень на многое ругался :) Можешь напрямую DirectShow юзать как вариант, но кроссплатформенно, для винце - фонон. FFMpeg крут, но его собирать... :)))

Если перестал работать доп. поток, ищи проблему в другом. К примеру, память. Или еще что.

В случае 15 файлов - останавливай, выгружай, загружай новый файл. А ты просто не выгружал предыдущий файл.

Автор: mezmay 24.3.2011, 17:12

Плюнул на 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


файл csound.cpp:
Раскрывающийся текст
#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();
}

Автор: ufna 24.3.2011, 21:51

вавки вопроизводить кстати не лучшая идея для бедных винце :)

а так - с фононом все ок, если что-то не ок, то проблема в логике

Автор: mezmay 25.3.2011, 15:34

Цитата(ufna @ 24.3.2011, 21:51) *
вавки вопроизводить кстати не лучшая идея для бедных винце :)

а так - с фононом все ок, если что-то не ок, то проблема в логике

Я когда от Фонона к своему классу перешел, логику не поменял. Но все заработало :) И setSound() можно вызывать сколько угодно раз

Автор: ufna 28.3.2011, 13:35

Ты не поменял логику использования, т.е. "интерфейс", но логика внутренняя в целом поменялась

Форум Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)