19 class VoiceNavigationModelPrivate
22 VoiceNavigationModel* m_parent;
26 bool m_speakerEnabled;
30 QMap<Maneuver::Direction, QString> m_turnTypeMap;
32 QMap<Maneuver::Direction, QString> m_announceMap;
38 GeoDataCoordinates m_lastTurnPoint;
42 bool m_destinationReached;
46 VoiceNavigationModelPrivate( VoiceNavigationModel* parent );
50 QString audioFile(
const QString &name);
52 QString distanceAudioFile( qreal dest );
58 void updateInstruction(
const QString &name );
60 void initializeMaps();
63 VoiceNavigationModelPrivate::VoiceNavigationModelPrivate( VoiceNavigationModel* parent ) :
65 m_speakerEnabled( true ),
67 m_lastDistance( 0.0 ),
68 m_lastTurnType( Maneuver::Unknown ),
69 m_destinationReached( false ),
75 void VoiceNavigationModelPrivate::reset()
80 QString VoiceNavigationModelPrivate::audioFile(
const QString &name )
82 QStringList
const formats = QStringList() <<
"ogg" <<
"mp3" <<
"wav";
83 if ( m_speakerEnabled ) {
84 QString
const audioTemplate =
"%1/%2.%3";
85 foreach(
const QString &format, formats ) {
86 QString
const result = audioTemplate.arg( m_speaker ).arg( name ).arg( format );
87 QFileInfo audioFile( result );
88 if ( audioFile.exists() ) {
94 QString
const audioTemplate =
"audio/%1.%2";
95 foreach(
const QString &format, formats ) {
96 QString
const result =
MarbleDirs::path( audioTemplate.arg( name ).arg( format ) );
97 if ( !result.isEmpty() ) {
105 QString VoiceNavigationModelPrivate::distanceAudioFile( qreal dest )
107 if ( dest > 0.0 && dest < 900.0 ) {
108 qreal minDistance = 0.0;
109 int targetDistance = 0;
110 QVector<int> distances;
111 distances << 50 << 80 << 100 << 200 << 300 << 400 << 500 << 600 << 700 << 800;
112 foreach(
int distance, distances ) {
113 QString file = audioFile( QString::number( distance ) );
114 qreal currentDistance = qAbs( distance - dest );
115 if ( !file.isEmpty() && ( minDistance == 0.0 || currentDistance < minDistance ) ) {
116 minDistance = currentDistance;
117 targetDistance = distance;
121 if ( targetDistance > 0 ) {
122 return audioFile( QString::number( targetDistance ) );
129 QString VoiceNavigationModelPrivate::turnTypeAudioFile(
Maneuver::Direction turnType, qreal distance )
131 bool const announce = distance >= 75;
132 QMap<Maneuver::Direction, QString>
const & map = announce ? m_announceMap : m_turnTypeMap;
133 if ( m_speakerEnabled && map.contains( turnType ) ) {
134 return audioFile( map[turnType] );
137 return audioFile( announce ?
"KDE-Sys-List-End" :
"KDE-Sys-App-Positive" );
140 void VoiceNavigationModelPrivate::updateInstruction( qreal distance,
Maneuver::Direction turnType )
143 QString turnTypeAudio = turnTypeAudioFile( turnType, distance );
144 if ( turnTypeAudio.isEmpty() ) {
145 mDebug() <<
"Missing audio file for turn type " << turnType <<
" and speaker " << m_speaker;
150 m_queue << turnTypeAudio;
151 emit m_parent->instructionChanged();
159 void VoiceNavigationModelPrivate::updateInstruction(
const QString &name )
162 m_queue << audioFile( name );
163 emit m_parent->instructionChanged();
166 void VoiceNavigationModelPrivate::initializeMaps()
168 m_turnTypeMap.clear();
169 m_announceMap.clear();
207 QObject( parent ), d( new VoiceNavigationModelPrivate( this ) )
224 if ( speaker != d->m_speaker ) {
225 QFileInfo speakerDir = QFileInfo( speaker );
226 if ( !speakerDir.exists() ) {
239 return d->m_speakerEnabled;
244 if ( enabled != d->m_speakerEnabled ) {
245 d->m_speakerEnabled = enabled;
259 d->updateInstruction( d->m_speakerEnabled ?
"GpsLost" :
"KDE-Sys-List-End" );
263 d->updateInstruction( d->m_speakerEnabled ?
"GpsFound" :
"KDE-Sys-App-Positive" );
266 d->m_gpsStatus = status;
271 if ( d->m_destinationReached && distanceTarget < 250 ) {
275 if ( !d->m_destinationReached && distanceTarget < 50 ) {
276 d->m_destinationReached =
true;
277 d->updateInstruction( d->m_speakerEnabled ?
"Arrive" :
"KDE-Sys-App-Positive" );
281 if ( distanceTarget > 150 ) {
282 d->m_destinationReached =
false;
285 if ( deviated && !d->m_deviated ) {
286 d->updateInstruction( d->m_speakerEnabled ?
"RouteDeviated" :
"KDE-Sys-List-End" );
288 d->m_deviated = deviated;
299 bool const announcement = ( d->m_lastDistance == 0 || d->m_lastDistance > 850 ) && distanceManuever <= 850;
300 bool const turn = ( d->m_lastDistance == 0 || d->m_lastDistance > 75 ) && distanceManuever <= 75;
301 if ( announcement || turn ) {
302 d->updateInstruction( distanceManuever, turnType );
305 d->m_lastTurnType = turnType;
306 d->m_lastDistance = distanceManuever;
311 return d->audioFile( d->m_speakerEnabled ?
"Marble" :
"KDE-Sys-App-Positive" );
316 return d->m_queue.isEmpty() ? QString() : d->m_queue.first();
321 #include "VoiceNavigationModel.moc"
void isSpeakerEnabledChanged()
static QString path(const QString &relativePath)
VoiceNavigationModel(QObject *parent=0)
Constructor.
void setSpeaker(const QString &speaker)
bool isSpeakerEnabled() const
~VoiceNavigationModel()
Destructor.
const RouteSegment & currentSegment() const
const RouteSegment & nextRouteSegment() const
void handleTrackingStatusChange(PositionProviderStatus status)
Direction direction() const
QString instruction() const
void update(const Route &route, qreal distanceManuever, qreal distanceTarget, bool deviated)
void setSpeakerEnabled(bool enabled)
GeoDataCoordinates position() const
QDebug mDebug()
a function to replace qDebug() in Marble library code
const Maneuver & maneuver() const