2013-04-04 44 views
2

我想在buttonpress上播放声音,我有一个工作代码。按下Qt播放音频;高效

Phonon::MediaObject *bulletPlay = new Phonon::MediaObject(this); 
bulletPlay -> setCurrentSource(Phonon::MediaSource("newBullet3.wav")); 
playOutput = new Phonon::AudioOutput(Phonon::MusicCategory, this); 
Phonon::createPath(bulletPlay, playOutput); 
bulletPlay->play(); 

但在做所有的按钮按下这些东西导致性能受到伤害。我了解每次光盘访问都是原因。 (嗯..你可以说,文件将反正在内存中,因此没有磁盘访问每个按钮按下缓冲区缓存和所有..但这个代码是造成性能严重受伤。)

那么什么我只是做了

static Phonon::MediaObject *bulletPlay; 
static Phonon::AudioOutput *playOutput; 
static Phonon::MediaSource *filePath; 

在我的课。并在构造函数

bulletPlay = new Phonon::MediaObject(this); 
filePath = new Phonon::MediaSource("newBullet3.wav"); 
bulletPlay -> setCurrentSource(*filePath); 
playOutput = new Phonon::AudioOutput(Phonon::MusicCategory, this); 
Phonon::createPath(bulletPlay, playOutput); 

bulletPlay->play(); on buttonpress。

但它只是第一次播放声音。因此,似乎我必须每次使用bulletPlay -> setCurrentSource(*filePath);来设置当前资源。那么我该如何去做呢?我不想每次都设置当前资源..我无法测试应用性能测试也因为测试是在客户端..

+0

您是否在调用play()之前尝试[seek](http://qt-project.org/doc/qt-4.8/phonon-videoplayer.html#seek)? – 2013-04-04 15:25:28

回答

1

你需要在你的类来创建一个单独的slot的按钮触发,而不是直接连接到buttonPlay->play()按钮。您看到的问题是buttonPlay对象正在使用的音频缓冲区是“最后”。所以你需要告诉它从头开始,这是bulletPlay -> setCurrentSource(*filePath);正在为你做的。你不需要创建一个新的资源,你应该能够告诉现有的资源重用当前的资源(但只是从头开始)。