crossplatform.ru

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

 
Ответить в данную темуНачать новую тему
> почему звук проигрывается не всегда?, phonon
mezmay
  опции профиля:
сообщение 22.3.2011, 14:07
Сообщение #1


Активный участник
***

Группа: Участник
Сообщений: 272
Регистрация: 13.7.2009
Из: Ростов-на-Дону
Пользователь №: 904

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




Репутация:   1  


Описываю медиа-объект:
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 - 22.3.2011, 14:08
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
mezmay
  опции профиля:
сообщение 23.3.2011, 11:42
Сообщение #2


Активный участник
***

Группа: Участник
Сообщений: 272
Регистрация: 13.7.2009
Из: Ростов-на-Дону
Пользователь №: 904

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




Репутация:   1  


Уточняю информацию - у меня могут проигрываться 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
Сообщение #3


Активный участник
***

Группа: Участник
Сообщений: 272
Регистрация: 13.7.2009
Из: Ростов-на-Дону
Пользователь №: 904

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




Репутация:   1  


И все-таки даже когда только 1 медиа-объект - все равно глючит...
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
ufna
  опции профиля:
сообщение 23.3.2011, 17:59
Сообщение #4


Активный участник
***

Группа: Участник
Сообщений: 362
Регистрация: 24.5.2008
Из: Курган/СПб
Пользователь №: 182

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




Репутация:   5  


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

Задавай медиа сорс один раз, потом плей. При окончании проигрывания, откатывай на ноль (тупо стоп к примеру или seek(0)), и далее плей отлично заново идет.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
mezmay
  опции профиля:
сообщение 24.3.2011, 12:08
Сообщение #5


Активный участник
***

Группа: Участник
Сообщений: 272
Регистрация: 13.7.2009
Из: Ростов-на-Дону
Пользователь №: 904

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




Репутация:   1  


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


Активный участник
***

Группа: Участник
Сообщений: 362
Регистрация: 24.5.2008
Из: Курган/СПб
Пользователь №: 182

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




Репутация:   5  


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

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

В случае 15 файлов - останавливай, выгружай, загружай новый файл. А ты просто не выгружал предыдущий файл.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
mezmay
  опции профиля:
сообщение 24.3.2011, 17:12
Сообщение #7


Активный участник
***

Группа: Участник
Сообщений: 272
Регистрация: 13.7.2009
Из: Ростов-на-Дону
Пользователь №: 904

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




Репутация:   1  


Плюнул на 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
Сообщение #8


Активный участник
***

Группа: Участник
Сообщений: 362
Регистрация: 24.5.2008
Из: Курган/СПб
Пользователь №: 182

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




Репутация:   5  


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

а так - с фононом все ок, если что-то не ок, то проблема в логике
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
mezmay
  опции профиля:
сообщение 25.3.2011, 15:34
Сообщение #9


Активный участник
***

Группа: Участник
Сообщений: 272
Регистрация: 13.7.2009
Из: Ростов-на-Дону
Пользователь №: 904

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




Репутация:   1  


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

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

Я когда от Фонона к своему классу перешел, логику не поменял. Но все заработало :) И setSound() можно вызывать сколько угодно раз
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
ufna
  опции профиля:
сообщение 28.3.2011, 13:35
Сообщение #10


Активный участник
***

Группа: Участник
Сообщений: 362
Регистрация: 24.5.2008
Из: Курган/СПб
Пользователь №: 182

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




Репутация:   5  


Ты не поменял логику использования, т.е. "интерфейс", но логика внутренняя в целом поменялась
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

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


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




RSS Текстовая версия Сейчас: 28.3.2024, 15:31