crossplatform.ru

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


  Ответ в почему звук проигрывается не всегда?
Введите ваше имя
Подтвердите код

Введите в поле код из 6 символов, отображенных в виде изображения. Если вы не можете прочитать код с изображения, нажмите на изображение для генерации нового кода.
 

Опции сообщения
 Включить смайлы?
Иконки сообщения
(Опционально)
                                
                                
  [ Без иконки ]
 


Последние 10 сообщений [ в обратном порядке ]
ufna Дата 28.3.2011, 13:35
  Ты не поменял логику использования, т.е. "интерфейс", но логика внутренняя в целом поменялась
mezmay Дата 25.3.2011, 15:34
 
Цитата(ufna @ 24.3.2011, 21:51) *
вавки вопроизводить кстати не лучшая идея для бедных винце :)

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

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

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

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

В случае 15 файлов - останавливай, выгружай, загружай новый файл. А ты просто не выгружал предыдущий файл.
mezmay Дата 24.3.2011, 12:08
  Да твой вариант работает. Только как быть если мне в различных ситуациях надо проигрывать до 15-ти аудиофайлов? Создавать массив из 15 медиаобъектов, каждому 1 раз задавать сорс, соединять их с 15-ю аудиоаутпутами...? И следить чтобы все это одновременно не проигрывалось?
Я сделал так, но при этом перестал работать дополнительный поток, который никак со звуком не связан. В общем пока какие-то неразрешимые проблемы с фононом.
Может все-таки посоветуешь другую кроссплатформенную библиотеку чтобы Win CE поддерживала?
ufna Дата 23.3.2011, 17:59
  чет мне кажется, что зря ты каждый раз при плее задаешь медиа сорс - скорее всего у тебя оперативка вся забивается после нескольких раз, т.к. сорс открывается заново, а старый - засчет path'а еще жив.

Задавай медиа сорс один раз, потом плей. При окончании проигрывания, откатывай на ноль (тупо стоп к примеру или seek(0)), и далее плей отлично заново идет.
mezmay Дата 23.3.2011, 17:18
  И все-таки даже когда только 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 Дата 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
Просмотр темы полностью (откроется в новом окне)
RSS Текстовая версия Сейчас: 29.3.2024, 3:04