mirror of
https://github.com/xiaoyifang/goldendict-ng.git
synced 2024-11-27 19:24:08 +00:00
109 lines
2.6 KiB
C++
109 lines
2.6 KiB
C++
|
#include "speechclient.hh"
|
||
|
#include <QtCore>
|
||
|
|
||
|
#include <windows.h>
|
||
|
#include "speechhlp.hh"
|
||
|
|
||
|
struct SpeechClient::InternalData
|
||
|
{
|
||
|
InternalData( QString const & engineId ):
|
||
|
waitingFinish( false )
|
||
|
{
|
||
|
sp = speechCreate( reinterpret_cast<const wchar_t*>( engineId.utf16() ) );
|
||
|
}
|
||
|
|
||
|
~InternalData()
|
||
|
{
|
||
|
speechDestroy( sp );
|
||
|
}
|
||
|
|
||
|
SpeechHelper sp;
|
||
|
Engine engine;
|
||
|
typedef QPointer<SpeechClient> Ptr;
|
||
|
static QList<Ptr> ptrs;
|
||
|
bool waitingFinish;
|
||
|
};
|
||
|
|
||
|
QList<SpeechClient::InternalData::Ptr> SpeechClient::InternalData::ptrs =
|
||
|
QList<SpeechClient::InternalData::Ptr>();
|
||
|
|
||
|
SpeechClient::SpeechClient( QString const & engineId, QObject * parent ):
|
||
|
QObject( parent ),
|
||
|
internalData( new InternalData( engineId ) )
|
||
|
{
|
||
|
Engine engine;
|
||
|
engine.id = QString::fromWCharArray( speechEngineId( internalData->sp ) );
|
||
|
engine.name = QString::fromWCharArray( speechEngineName( internalData->sp ) );
|
||
|
internalData->ptrs.push_back( this );
|
||
|
}
|
||
|
|
||
|
SpeechClient::~SpeechClient()
|
||
|
{
|
||
|
internalData->ptrs.removeAll( this );
|
||
|
delete internalData;
|
||
|
}
|
||
|
|
||
|
static bool enumEngines( void * /* token */,
|
||
|
const wchar_t * id,
|
||
|
const wchar_t * name,
|
||
|
void * userData )
|
||
|
{
|
||
|
SpeechClient::Engines *pEngines = (SpeechClient::Engines *)userData;
|
||
|
SpeechClient::Engine engine =
|
||
|
{
|
||
|
QString::fromWCharArray( id ),
|
||
|
QString::fromWCharArray( name )
|
||
|
};
|
||
|
pEngines->push_back( engine );
|
||
|
return true;
|
||
|
}
|
||
|
|
||
|
SpeechClient::Engines SpeechClient::availableEngines()
|
||
|
{
|
||
|
Engines engines;
|
||
|
speechEnumerateAvailableEngines( enumEngines, &engines );
|
||
|
return engines;
|
||
|
}
|
||
|
|
||
|
const SpeechClient::Engine & SpeechClient::engine() const
|
||
|
{
|
||
|
return internalData->engine;
|
||
|
}
|
||
|
|
||
|
bool SpeechClient::tell( QString const & text ) const
|
||
|
{
|
||
|
if ( !speechAvailable( internalData->sp ) )
|
||
|
return false;
|
||
|
|
||
|
if ( internalData->waitingFinish )
|
||
|
return false;
|
||
|
|
||
|
internalData->waitingFinish = true;
|
||
|
const_cast<SpeechClient *>( this )->startTimer( 50 );
|
||
|
return speechTell( internalData->sp, reinterpret_cast<const wchar_t*>( text.utf16() ) );
|
||
|
}
|
||
|
|
||
|
bool SpeechClient::say( QString const & text ) const
|
||
|
{
|
||
|
if ( !speechAvailable( internalData->sp ) )
|
||
|
return false;
|
||
|
|
||
|
return speechSay( internalData->sp, reinterpret_cast<const wchar_t*>( text.utf16() ) );
|
||
|
}
|
||
|
|
||
|
void SpeechClient::timerEvent( QTimerEvent * evt )
|
||
|
{
|
||
|
QObject::timerEvent( evt );
|
||
|
|
||
|
if ( !internalData->waitingFinish )
|
||
|
return;
|
||
|
|
||
|
if ( speechTellFinished( internalData->sp ) )
|
||
|
{
|
||
|
killTimer( evt->timerId() ) ;
|
||
|
internalData->waitingFinish = false;
|
||
|
emit finished();
|
||
|
emit finished( this );
|
||
|
}
|
||
|
}
|