LINUX.ORG.RU

Вывод звука через phonon


0

0

Делаю озвучку для приложения. Необходимо, чтобы просто-напросто воспроизводились секундные звуковые сообщения. Причём, необходима многопоточность: чтобы два разных звука могли играть в один момент времени, но не один и тот же звук.

Для етого создаю два класса: Audio : QObject и TMediaObject : Phonon::MediaObject. Далее части кода:

TMediaObject::TMediaObject(SoundType st)
{
soundType = st;
connect(this, SIGNAL(finished()), this, SLOT(finish()));
}

void TMediaObject::finish()
{
emit finishedPlaying(soundType);
deleteLater();
}

Audio::~Audio()
{
delete output;
}

void Audio::play(SoundType soundType) //soundType - собственно играемый звук
{
if (!sounds.contains(soundType)) //если данный звук щё не играется
{
sounds.insert(soundType);
media = new TMediaObject(soundType);
connect(media, SIGNAL(finishedPlaying(SoundType)), this, SLOT(finish(SoundType)));
QString mediaFile = soundDescription(soundType); //преобразование типа звука к имени звукового файла
      
if (mediaFile == "")
qDebug() << «Error: Media file not found»;
else
{
Phonon::createPath(media, output);
media->setCurrentSource(Phonon::MediaSource(theRM.getSoundsPath() + «/» + mediaFile + ".ogg"));
media->play();
}
}
}

void Audio::finish(SoundType soundType)
{
sounds.remove(soundType);
}

Проигрывание звука начинается в Audio::play, в которую передаётся тип звука.
Проблемы такие:
- одновременно два звука игратся не хотят. Если один уже проигрывается, то для второго выдаётся ошибка Phonon::createPath: Cannot connect TMediaObject ( no objectName ) to Phonon::AudioOutput ( no objectName )
- утечки памяти. Я вроде подчищаю все созданные переменные, но память приложения после добавления звука стала кушатся сильнее, причём вскоре звук пропадает вобще. Причём по-разному, либо после 10 вызовов play, либо аж после 100, но пропадает стабильно.

И такие щё вопросы: каким образом можно щё программировать звук под Qt? Может стоит забить на Phonon?

Попробуй QtMultimedia

Проигрывание звука:

QFile inputFile("/tmp/test.raw");
QAudioOutput* audio;
inputFile.open(QIODevice::ReadOnly);

QAudioDeviceInfo info(QAudioDeviceInfo::defaultOutputDevice());

audio = new QAudioOutput(info);
audio->start(&inputFile);

Сам не пробовал, написал по документации.

Kosyak ★★★★
()

> http://old.nabble.com/QtMultimedia,-Phonon,-tougths.-td27865474.html
Самое интересное, что если создать класс TaskAudio, в котором потом создавать класс Audio, то звуки параллельно работают.

Попробуй QtMultimedia

Что-то сложно даётся.. Пока сделал, как написал выше, на основе TaskAudio, но может перейду на QtMultimedia как только освою

abr_linux
() автор топика
Ответ на: комментарий от Gorthauer

Я под виндой долгое время прогал под Делфи, пока не перешёл на Линукс. так что, остаточное :)

abr_linux
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.