Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
Q
qgroundcontrol
Project
Project
Details
Activity
Releases
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
Valentin Platzgummer
qgroundcontrol
Commits
7abe60d1
Commit
7abe60d1
authored
Oct 21, 2015
by
Gus Grubba
Browse files
Options
Browse Files
Download
Plain Diff
Merge pull request #2070 from dogmaphobic/textToSpeech
Text to Speech Work
parents
fec16350
dd587ce2
Changes
7
Expand all
Hide whitespace changes
Inline
Side-by-side
Showing
7 changed files
with
261 additions
and
174 deletions
+261
-174
QGCExternalLibs.pri
QGCExternalLibs.pri
+85
-80
UsbDeviceJNI.java
android/src/org/qgroundcontrol/qgchelper/UsbDeviceJNI.java
+33
-1
GAudioOutput.cc
src/GAudioOutput.cc
+34
-11
GAudioOutput.h
src/GAudioOutput.h
+7
-4
QGCAudioWorker.cpp
src/audio/QGCAudioWorker.cpp
+66
-32
QGCAudioWorker.h
src/audio/QGCAudioWorker.h
+3
-9
UAS.cc
src/uas/UAS.cc
+33
-37
No files found.
QGCExternalLibs.pri
View file @
7abe60d1
...
@@ -11,8 +11,8 @@ WindowsBuild {
...
@@ -11,8 +11,8 @@ WindowsBuild {
# the selected autopilot system.
# the selected autopilot system.
#
#
# If the user config file exists, it will be included. If this file
# If the user config file exists, it will be included. If this file
# specifies the MAVLINK_CONF variable with a MAVLink dialect, support
# specifies the MAVLINK_CONF variable with a MAVLink dialect, support
# for it will be compiled in to QGC. It will also create a
# for it will be compiled in to QGC. It will also create a
# QGC_USE_{AUTOPILOT_NAME}_MESSAGES macro for use within the actual code.
# QGC_USE_{AUTOPILOT_NAME}_MESSAGES macro for use within the actual code.
#
#
MAVLINKPATH_REL = libs/mavlink/include/mavlink/v1.0
MAVLINKPATH_REL = libs/mavlink/include/mavlink/v1.0
...
@@ -79,20 +79,20 @@ INCLUDEPATH += libs/qwt
...
@@ -79,20 +79,20 @@ INCLUDEPATH += libs/qwt
# Uninstalling from Linux can be done with `sudo make uninstall`.
# Uninstalling from Linux can be done with `sudo make uninstall`.
#
#
XBEE_DEPENDENT_HEADERS += \
XBEE_DEPENDENT_HEADERS += \
src/comm/XbeeLinkInterface.h \
src/comm/XbeeLinkInterface.h \
src/comm/XbeeLink.h \
src/comm/XbeeLink.h \
src/comm/HexSpinBox.h \
src/comm/HexSpinBox.h \
src/ui/XbeeConfigurationWindow.h \
src/ui/XbeeConfigurationWindow.h \
src/comm/CallConv.h
src/comm/CallConv.h
XBEE_DEPENDENT_SOURCES += \
XBEE_DEPENDENT_SOURCES += \
src/comm/XbeeLink.cpp \
src/comm/XbeeLink.cpp \
src/comm/HexSpinBox.cpp \
src/comm/HexSpinBox.cpp \
src/ui/XbeeConfigurationWindow.cpp
src/ui/XbeeConfigurationWindow.cpp
XBEE_DEFINES = QGC_XBEE_ENABLED
XBEE_DEFINES = QGC_XBEE_ENABLED
contains(DEFINES, DISABLE_XBEE) {
contains(DEFINES, DISABLE_XBEE) {
message("Skipping support for native XBee API (manual override from command line)")
message("Skipping support for native XBee API (manual override from command line)")
DEFINES -= DISABLE_XBEE
DEFINES -= DISABLE_XBEE
# Otherwise the user can still disable this feature in the user_config.pri file.
# Otherwise the user can still disable this feature in the user_config.pri file.
} else:exists(user_config.pri):infile(user_config.pri, DEFINES, DISABLE_XBEE) {
} else:exists(user_config.pri):infile(user_config.pri, DEFINES, DISABLE_XBEE) {
message("Skipping support for native XBee API (manual override from user_config.pri)")
message("Skipping support for native XBee API (manual override from user_config.pri)")
...
@@ -100,50 +100,50 @@ contains(DEFINES, DISABLE_XBEE) {
...
@@ -100,50 +100,50 @@ contains(DEFINES, DISABLE_XBEE) {
linux-g++-64 {
linux-g++-64 {
message("Skipping support for XBee API (64-bit Linux builds not supported)")
message("Skipping support for XBee API (64-bit Linux builds not supported)")
} else:exists(/usr/include/xbee.h) {
} else:exists(/usr/include/xbee.h) {
message("Including support for XBee API")
message("Including support for XBee API")
HEADERS += $$XBEE_DEPENDENT_HEADERS
HEADERS += $$XBEE_DEPENDENT_HEADERS
SOURCES += $$XBEE_DEPENDENT_SOURCES
SOURCES += $$XBEE_DEPENDENT_SOURCES
DEFINES += $$XBEE_DEFINES
DEFINES += $$XBEE_DEFINES
LIBS += -L/usr/lib -lxbee
LIBS += -L/usr/lib -lxbee
} else {
} else {
warning("Skipping support for XBee API (missing libraries, see README)")
warning("Skipping support for XBee API (missing libraries, see README)")
}
}
} else:WindowsBuild {
} else:WindowsBuild {
message("Including support for XBee API")
message("Including support for XBee API")
HEADERS += $$XBEE_DEPENDENT_HEADERS
HEADERS += $$XBEE_DEPENDENT_HEADERS
SOURCES += $$XBEE_DEPENDENT_SOURCES
SOURCES += $$XBEE_DEPENDENT_SOURCES
DEFINES += $$XBEE_DEFINES
DEFINES += $$XBEE_DEFINES
INCLUDEPATH += libs/thirdParty/libxbee
INCLUDEPATH += libs/thirdParty/libxbee
LIBS += -l$$BASEDIR/libs/thirdParty/libxbee/lib/libxbee
LIBS += -l$$BASEDIR/libs/thirdParty/libxbee/lib/libxbee
} else {
} else {
message("Skipping support for XBee API (unsupported platform)")
message("Skipping support for XBee API (unsupported platform)")
}
}
#
#
# [OPTIONAL] Magellan 3DxWare library. Provides support for 3DConnexion's 3D mice.
# [OPTIONAL] Magellan 3DxWare library. Provides support for 3DConnexion's 3D mice.
#
#
contains(DEFINES, DISABLE_3DMOUSE) {
contains(DEFINES, DISABLE_3DMOUSE) {
message("Skipping support for 3DConnexion mice (manual override from command line)")
message("Skipping support for 3DConnexion mice (manual override from command line)")
DEFINES -= DISABLE_3DMOUSE
DEFINES -= DISABLE_3DMOUSE
# Otherwise the user can still disable this feature in the user_config.pri file.
# Otherwise the user can still disable this feature in the user_config.pri file.
} else:exists(user_config.pri):infile(user_config.pri, DEFINES, DISABLE_3DMOUSE) {
} else:exists(user_config.pri):infile(user_config.pri, DEFINES, DISABLE_3DMOUSE) {
message("Skipping support for 3DConnexion mice (manual override from user_config.pri)")
message("Skipping support for 3DConnexion mice (manual override from user_config.pri)")
} else:LinuxBuild {
} else:LinuxBuild {
exists(/usr/local/lib/libxdrvlib.so) {
exists(/usr/local/lib/libxdrvlib.so) {
message("Including support for 3DConnexion mice")
message("Including support for 3DConnexion mice")
DEFINES += \
DEFINES += \
QGC_MOUSE_ENABLED_LINUX \
QGC_MOUSE_ENABLED_LINUX \
ParameterCheck
ParameterCheck
# Hack: Has to be defined for magellan usage
# Hack: Has to be defined for magellan usage
HEADERS += src/input/Mouse6dofInput.h
HEADERS += src/input/Mouse6dofInput.h
SOURCES += src/input/Mouse6dofInput.cpp
SOURCES += src/input/Mouse6dofInput.cpp
LIBS += -L/usr/local/lib/ -lxdrvlib
LIBS += -L/usr/local/lib/ -lxdrvlib
} else {
} else {
warning("Skipping support for 3DConnexion mice (missing libraries, see README)")
warning("Skipping support for 3DConnexion mice (missing libraries, see README)")
}
}
} else:WindowsBuild {
} else:WindowsBuild {
message("Including support for 3DConnexion mice")
message("Including support for 3DConnexion mice")
...
@@ -162,52 +162,52 @@ contains(DEFINES, DISABLE_3DMOUSE) {
...
@@ -162,52 +162,52 @@ contains(DEFINES, DISABLE_3DMOUSE) {
libs/thirdParty/3DMouse/win/Mouse3DInput.cpp \
libs/thirdParty/3DMouse/win/Mouse3DInput.cpp \
src/input/Mouse6dofInput.cpp
src/input/Mouse6dofInput.cpp
} else {
} else {
message("Skipping support for 3DConnexion mice (unsupported platform)")
message("Skipping support for 3DConnexion mice (unsupported platform)")
}
}
#
#
# [OPTIONAL] Opal RT-LAB Library. Provides integration with Opal-RT's RT-LAB simulator.
# [OPTIONAL] Opal RT-LAB Library. Provides integration with Opal-RT's RT-LAB simulator.
#
#
contains(DEFINES, DISABLE_RTLAB) {
contains(DEFINES, DISABLE_RTLAB) {
message("Skipping support for RT-LAB (manual override from command line)")
message("Skipping support for RT-LAB (manual override from command line)")
DEFINES -= DISABLE_RTLAB
DEFINES -= DISABLE_RTLAB
# Otherwise the user can still disable this feature in the user_config.pri file.
# Otherwise the user can still disable this feature in the user_config.pri file.
} else:exists(user_config.pri):infile(user_config.pri, DEFINES, DISABLE_RTLAB) {
} else:exists(user_config.pri):infile(user_config.pri, DEFINES, DISABLE_RTLAB) {
message("Skipping support for RT-LAB (manual override from user_config.pri)")
message("Skipping support for RT-LAB (manual override from user_config.pri)")
} else:WindowsBuild {
} else:WindowsBuild {
exists(src/lib/opalrt/OpalApi.h) : exists(C:/OPAL-RT/RT-LAB7.2.4/Common/bin) {
exists(src/lib/opalrt/OpalApi.h) : exists(C:/OPAL-RT/RT-LAB7.2.4/Common/bin) {
message("Including support for RT-LAB")
message("Including support for RT-LAB")
DEFINES += QGC_RTLAB_ENABLED
DEFINES += QGC_RTLAB_ENABLED
INCLUDEPATH +=
INCLUDEPATH +=
src/lib/opalrt
src/lib/opalrt
libs/lib/opal/include \
libs/lib/opal/include \
FORMS += src/ui/OpalLinkSettings.ui
FORMS += src/ui/OpalLinkSettings.ui
HEADERS += \
HEADERS += \
src/comm/OpalRT.h \
src/comm/OpalRT.h \
src/comm/OpalLink.h \
src/comm/OpalLink.h \
src/comm/Parameter.h \
src/comm/Parameter.h \
src/comm/QGCParamID.h \
src/comm/QGCParamID.h \
src/comm/ParameterList.h \
src/comm/ParameterList.h \
src/ui/OpalLinkConfigurationWindow.h
src/ui/OpalLinkConfigurationWindow.h
SOURCES += \
SOURCES += \
src/comm/OpalRT.cc \
src/comm/OpalRT.cc \
src/comm/OpalLink.cc \
src/comm/OpalLink.cc \
src/comm/Parameter.cc \
src/comm/Parameter.cc \
src/comm/QGCParamID.cc \
src/comm/QGCParamID.cc \
src/comm/ParameterList.cc \
src/comm/ParameterList.cc \
src/ui/OpalLinkConfigurationWindow.cc
src/ui/OpalLinkConfigurationWindow.cc
LIBS += \
LIBS += \
-LC:/OPAL-RT/RT-LAB7.2.4/Common/bin \
-LC:/OPAL-RT/RT-LAB7.2.4/Common/bin \
-lOpalApi
-lOpalApi
} else {
} else {
warning("Skipping support for RT-LAB (missing libraries, see README)")
warning("Skipping support for RT-LAB (missing libraries, see README)")
}
}
} else {
} else {
message("Skipping support for RT-LAB (unsupported platform)")
message("Skipping support for RT-LAB (unsupported platform)")
}
}
...
@@ -225,12 +225,12 @@ MacBuild {
...
@@ -225,12 +225,12 @@ MacBuild {
-F$$BASEDIR/libs/lib/Frameworks \
-F$$BASEDIR/libs/lib/Frameworks \
-framework SDL
-framework SDL
} else:LinuxBuild {
} else:LinuxBuild {
PKGCONFIG = sdl
PKGCONFIG = sdl
} else:WindowsBuild {
} else:WindowsBuild {
INCLUDEPATH += \
INCLUDEPATH += \
$$BASEDIR/libs/lib/sdl/msvc/include \
$$BASEDIR/libs/lib/sdl/msvc/include \
LIBS += \
LIBS += \
-L$$BASEDIR/libs/lib/sdl/msvc/lib \
-L$$BASEDIR/libs/lib/sdl/msvc/lib \
-lSDLmain \
-lSDLmain \
-lSDL
-lSDL
...
@@ -244,20 +244,20 @@ MacBuild {
...
@@ -244,20 +244,20 @@ MacBuild {
# Windows is supported as of Windows 7
# Windows is supported as of Windows 7
#
#
contains (DEFINES, DISABLE_SPEECH) {
contains (DEFINES, DISABLE_SPEECH) {
message("Skipping support for speech output (manual override from command line)")
message("Skipping support for speech output (manual override from command line)")
DEFINES -= DISABLE_SPEECH
DEFINES -= DISABLE_SPEECH
# Otherwise the user can still disable this feature in the user_config.pri file.
# Otherwise the user can still disable this feature in the user_config.pri file.
} else:exists(user_config.pri):infile(user_config.pri, DEFINES, DISABLE_SPEECH) {
} else:exists(user_config.pri):infile(user_config.pri, DEFINES, DISABLE_SPEECH) {
message("Skipping support for speech output (manual override from user_config.pri)")
message("Skipping support for speech output (manual override from user_config.pri)")
} else:LinuxBuild {
} else:LinuxBuild {
exists(/usr/include/espeak) | exists(/usr/local/include/espeak) {
exists(/usr/include/espeak) | exists(/usr/local/include/espeak) {
message("Including support for speech output")
message("Including support for speech output")
DEFINES += QGC_SPEECH_ENABLED
DEFINES += QGC_SPEECH_ENABLED
LIBS += \
LIBS += \
-lespeak
-lespeak
} else {
} else {
warning("Skipping support for speech output (missing libraries, see README)")
warning("Skipping support for speech output (missing libraries, see README)")
}
}
}
}
# Mac support is built into OS 10.6+.
# Mac support is built into OS 10.6+.
else:MacBuild {
else:MacBuild {
...
@@ -270,6 +270,11 @@ else:WindowsBuild {
...
@@ -270,6 +270,11 @@ else:WindowsBuild {
DEFINES += QGC_SPEECH_ENABLED
DEFINES += QGC_SPEECH_ENABLED
LIBS += -lOle32
LIBS += -lOle32
}
}
# Android supports speech through native (Java) API.
else:AndroidBuild {
message("Including support for speech output")
DEFINES += QGC_SPEECH_ENABLED
}
#
#
# [OPTIONAL] Zeroconf for UDP links
# [OPTIONAL] Zeroconf for UDP links
...
...
android/src/org/qgroundcontrol/qgchelper/UsbDeviceJNI.java
View file @
7abe60d1
...
@@ -43,12 +43,15 @@ import android.content.IntentFilter;
...
@@ -43,12 +43,15 @@ import android.content.IntentFilter;
import
android.hardware.usb.*
;
import
android.hardware.usb.*
;
import
android.widget.Toast
;
import
android.widget.Toast
;
import
android.util.Log
;
import
android.util.Log
;
//-- Text To Speech
import
android.os.Bundle
;
import
android.speech.tts.TextToSpeech
;
import
com.hoho.android.usbserial.driver.*
;
import
com.hoho.android.usbserial.driver.*
;
import
org.qtproject.qt5.android.bindings.QtActivity
;
import
org.qtproject.qt5.android.bindings.QtActivity
;
import
org.qtproject.qt5.android.bindings.QtApplication
;
import
org.qtproject.qt5.android.bindings.QtApplication
;
public
class
UsbDeviceJNI
extends
QtActivity
public
class
UsbDeviceJNI
extends
QtActivity
implements
TextToSpeech
.
OnInitListener
{
{
public
static
int
BAD_PORT
=
0
;
public
static
int
BAD_PORT
=
0
;
private
static
UsbDeviceJNI
m_instance
;
private
static
UsbDeviceJNI
m_instance
;
...
@@ -61,6 +64,7 @@ public class UsbDeviceJNI extends QtActivity
...
@@ -61,6 +64,7 @@ public class UsbDeviceJNI extends QtActivity
private
BroadcastReceiver
m_UsbReceiver
=
null
;
private
BroadcastReceiver
m_UsbReceiver
=
null
;
private
final
static
ExecutorService
m_Executor
=
Executors
.
newSingleThreadExecutor
();
private
final
static
ExecutorService
m_Executor
=
Executors
.
newSingleThreadExecutor
();
private
static
final
String
TAG
=
"QGC_UsbDeviceJNI"
;
private
static
final
String
TAG
=
"QGC_UsbDeviceJNI"
;
private
static
TextToSpeech
m_tts
;
private
final
static
UsbIoManager
.
Listener
m_Listener
=
private
final
static
UsbIoManager
.
Listener
m_Listener
=
new
UsbIoManager
.
Listener
()
new
UsbIoManager
.
Listener
()
...
@@ -98,6 +102,34 @@ public class UsbDeviceJNI extends QtActivity
...
@@ -98,6 +102,34 @@ public class UsbDeviceJNI extends QtActivity
Log
.
i
(
TAG
,
"Instance created"
);
Log
.
i
(
TAG
,
"Instance created"
);
}
}
/////////////////////////////////////////////////////////////////////////////////////////////////////////
//
// Text To Speech
// Pigback a ride for providing TTS to QGC
//
/////////////////////////////////////////////////////////////////////////////////////////////////////////
@Override
public
void
onCreate
(
Bundle
savedInstanceState
)
{
super
.
onCreate
(
savedInstanceState
);
m_tts
=
new
TextToSpeech
(
this
,
this
);
}
@Override
protected
void
onDestroy
()
{
super
.
onDestroy
();
m_tts
.
shutdown
();
}
public
void
onInit
(
int
status
)
{
}
public
static
void
say
(
String
msg
)
{
Log
.
i
(
TAG
,
"Say: "
+
msg
);
m_tts
.
speak
(
msg
,
TextToSpeech
.
QUEUE_FLUSH
,
null
);
}
/////////////////////////////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////////////////////////////
//
//
// Find all current devices that match the device filter described in the androidmanifest.xml and the
// Find all current devices that match the device filter described in the androidmanifest.xml and the
...
...
src/GAudioOutput.cc
View file @
7abe60d1
...
@@ -38,42 +38,51 @@ This file is part of the QGROUNDCONTROL project
...
@@ -38,42 +38,51 @@ This file is part of the QGROUNDCONTROL project
#include "QGCApplication.h"
#include "QGCApplication.h"
#include "QGC.h"
#include "QGC.h"
#if defined __android__
#include <QtAndroidExtras/QtAndroidExtras>
#include <QtAndroidExtras/QAndroidJniObject>
#endif
IMPLEMENT_QGC_SINGLETON
(
GAudioOutput
,
GAudioOutput
)
IMPLEMENT_QGC_SINGLETON
(
GAudioOutput
,
GAudioOutput
)
const
char
*
GAudioOutput
::
_mutedKey
=
"AudioMuted"
;
const
char
*
GAudioOutput
::
_mutedKey
=
"AudioMuted"
;
GAudioOutput
::
GAudioOutput
(
QObject
*
parent
)
:
GAudioOutput
::
GAudioOutput
(
QObject
*
parent
)
QGCSingleton
(
parent
),
:
QGCSingleton
(
parent
)
muted
(
false
),
,
muted
(
false
)
thread
(
new
QThread
()),
#ifndef __android__
worker
(
new
QGCAudioWorker
())
,
thread
(
new
QThread
())
,
worker
(
new
QGCAudioWorker
())
#endif
{
{
QSettings
settings
;
QSettings
settings
;
muted
=
settings
.
value
(
_mutedKey
,
false
).
toBool
();
muted
=
settings
.
value
(
_mutedKey
,
false
).
toBool
();
muted
|=
qgcApp
()
->
runningUnitTests
();
muted
|=
qgcApp
()
->
runningUnitTests
();
#ifndef __android__
worker
->
moveToThread
(
thread
);
worker
->
moveToThread
(
thread
);
connect
(
this
,
&
GAudioOutput
::
textToSpeak
,
worker
,
&
QGCAudioWorker
::
say
);
connect
(
this
,
&
GAudioOutput
::
textToSpeak
,
worker
,
&
QGCAudioWorker
::
say
);
connect
(
thread
,
&
QThread
::
finished
,
thread
,
&
QObject
::
deleteLater
);
connect
(
thread
,
&
QThread
::
finished
,
thread
,
&
QObject
::
deleteLater
);
connect
(
thread
,
&
QThread
::
finished
,
worker
,
&
QObject
::
deleteLater
);
connect
(
thread
,
&
QThread
::
finished
,
worker
,
&
QObject
::
deleteLater
);
thread
->
start
();
thread
->
start
();
#endif
}
}
GAudioOutput
::~
GAudioOutput
()
GAudioOutput
::~
GAudioOutput
()
{
{
#ifndef __android__
thread
->
quit
();
thread
->
quit
();
#endif
}
}
void
GAudioOutput
::
mute
(
bool
mute
)
void
GAudioOutput
::
mute
(
bool
mute
)
{
{
QSettings
settings
;
QSettings
settings
;
muted
=
mute
;
muted
=
mute
;
settings
.
setValue
(
_mutedKey
,
mute
);
settings
.
setValue
(
_mutedKey
,
mute
);
#ifndef __android__
emit
mutedChanged
(
mute
);
emit
mutedChanged
(
mute
);
#endif
}
}
bool
GAudioOutput
::
isMuted
()
bool
GAudioOutput
::
isMuted
()
...
@@ -81,10 +90,24 @@ bool GAudioOutput::isMuted()
...
@@ -81,10 +90,24 @@ bool GAudioOutput::isMuted()
return
muted
;
return
muted
;
}
}
bool
GAudioOutput
::
say
(
const
QString
&
t
ext
,
int
severity
)
bool
GAudioOutput
::
say
(
const
QString
&
inT
ext
,
int
severity
)
{
{
if
(
!
muted
)
{
if
(
!
muted
)
{
emit
textToSpeak
(
text
,
severity
);
#if defined __android__
#if defined QGC_SPEECH_ENABLED
static
const
char
V_jniClassName
[]
{
"org/qgroundcontrol/qgchelper/UsbDeviceJNI"
};
QAndroidJniEnvironment
env
;
if
(
env
->
ExceptionCheck
())
{
env
->
ExceptionDescribe
();
env
->
ExceptionClear
();
}
QString
text
=
QGCAudioWorker
::
fixTextMessageForAudio
(
inText
);
QAndroidJniObject
javaMessage
=
QAndroidJniObject
::
fromString
(
text
);
QAndroidJniObject
::
callStaticMethod
<
void
>
(
V_jniClassName
,
"say"
,
"(Ljava/lang/String;)V"
,
javaMessage
.
object
<
jstring
>
());
#endif
#else
emit
textToSpeak
(
inText
,
severity
);
#endif
}
}
return
true
;
return
true
;
}
}
src/GAudioOutput.h
View file @
7abe60d1
...
@@ -48,9 +48,9 @@ This file is part of the PIXHAWK project
...
@@ -48,9 +48,9 @@ This file is part of the PIXHAWK project
class
GAudioOutput
:
public
QGCSingleton
class
GAudioOutput
:
public
QGCSingleton
{
{
Q_OBJECT
Q_OBJECT
DECLARE_QGC_SINGLETON
(
GAudioOutput
,
GAudioOutput
)
DECLARE_QGC_SINGLETON
(
GAudioOutput
,
GAudioOutput
)
public:
public:
/** @brief List available voices */
/** @brief List available voices */
QStringList
listVoices
(
void
);
QStringList
listVoices
(
void
);
...
@@ -88,13 +88,16 @@ signals:
...
@@ -88,13 +88,16 @@ signals:
protected:
protected:
bool
muted
;
bool
muted
;
#if !defined __android__
QThread
*
thread
;
QThread
*
thread
;
QGCAudioWorker
*
worker
;
QGCAudioWorker
*
worker
;
#endif
private:
private:
GAudioOutput
(
QObject
*
parent
=
NULL
);
GAudioOutput
(
QObject
*
parent
=
NULL
);
~
GAudioOutput
();
~
GAudioOutput
();
static
const
char
*
_mutedKey
;
static
const
char
*
_mutedKey
;
};
};
...
...
src/audio/QGCAudioWorker.cpp
View file @
7abe60d1
...
@@ -10,6 +10,47 @@
...
@@ -10,6 +10,47 @@
#if defined Q_OS_MAC && defined QGC_SPEECH_ENABLED
#if defined Q_OS_MAC && defined QGC_SPEECH_ENABLED
#include <ApplicationServices/ApplicationServices.h>
#include <ApplicationServices/ApplicationServices.h>
static
SpeechChannel
sc
;
static
Fixed
volume
;
static
void
speechDone
(
SpeechChannel
sc2
,
void
*
)
{
if
(
sc2
==
sc
)
{
DisposeSpeechChannel
(
sc
);
}
}
class
MacSpeech
{
public:
MacSpeech
()
{
setVolume
(
100
);
}
~
MacSpeech
()
{
}
void
say
(
const
char
*
words
)
{
while
(
SpeechBusy
())
{
QGC
::
SLEEP
::
msleep
(
100
);
}
NewSpeechChannel
(
NULL
,
&
sc
);
SetSpeechInfo
(
sc
,
soVolume
,
&
volume
);
SetSpeechInfo
(
sc
,
soSpeechDoneCallBack
,
reinterpret_cast
<
void
*>
(
speechDone
));
CFStringRef
cfstr
=
CFStringCreateWithCString
(
NULL
,
words
,
kCFStringEncodingUTF8
);
SpeakCFString
(
sc
,
cfstr
,
NULL
);
}
void
setVolume
(
int
v
)
{
volume
=
FixRatio
(
v
,
100
);
}
};
//-- Singleton
MacSpeech
macSpeech
;
#endif
#endif
// Speech synthesis is only supported with MSVC compiler
// Speech synthesis is only supported with MSVC compiler
...
@@ -18,7 +59,7 @@
...
@@ -18,7 +59,7 @@
#include <sapi.h>
#include <sapi.h>
#endif
#endif
#if defined Q_OS_LINUX && defined QGC_SPEECH_ENABLED
#if defined Q_OS_LINUX &&
!defined __android__ &&
defined QGC_SPEECH_ENABLED
// Using eSpeak for speech synthesis: following https://github.com/mondhs/espeak-sample/blob/master/sampleSpeak.cpp
// Using eSpeak for speech synthesis: following https://github.com/mondhs/espeak-sample/blob/master/sampleSpeak.cpp
#include <espeak/speak_lib.h>
#include <espeak/speak_lib.h>
#endif
#endif
...
@@ -48,7 +89,7 @@ void QGCAudioWorker::init()
...
@@ -48,7 +89,7 @@ void QGCAudioWorker::init()
sound
=
new
QSound
(
":/res/Alert"
);
sound
=
new
QSound
(
":/res/Alert"
);
#endif
#endif
#if defined Q_OS_LINUX && defined QGC_SPEECH_ENABLED
#if defined Q_OS_LINUX &&
!defined __android__ &&
defined QGC_SPEECH_ENABLED
espeak_Initialize
(
AUDIO_OUTPUT_SYNCH_PLAYBACK
,
500
,
NULL
,
0
);
// initialize for playback with 500ms buffer and no options (see speak_lib.h)
espeak_Initialize
(
AUDIO_OUTPUT_SYNCH_PLAYBACK
,
500
,
NULL
,
0
);
// initialize for playback with 500ms buffer and no options (see speak_lib.h)
espeak_VOICE
*
espeak_voice
=
espeak_GetCurrentVoice
();
espeak_VOICE
*
espeak_voice
=
espeak_GetCurrentVoice
();
espeak_voice
->
languages
=
"en-uk"
;
// Default to British English
espeak_voice
->
languages
=
"en-uk"
;
// Default to British English
...
@@ -82,25 +123,29 @@ void QGCAudioWorker::init()
...
@@ -82,25 +123,29 @@ void QGCAudioWorker::init()
QGCAudioWorker
::~
QGCAudioWorker
()
QGCAudioWorker
::~
QGCAudioWorker
()
{
{
#if defined _MSC_VER && defined QGC_SPEECH_ENABLED
#if defined _MSC_VER && defined QGC_SPEECH_ENABLED
if
(
pVoice
)
{
if
(
pVoice
)
{
pVoice
->
Release
();
pVoice
->
Release
();
pVoice
=
NULL
;
pVoice
=
NULL
;
}
}
::
CoUninitialize
();
::
CoUninitialize
();
#endif
#endif
}
}
void
QGCAudioWorker
::
say
(
QString
inText
,
int
severity
)
void
QGCAudioWorker
::
say
(
QString
inText
,
int
severity
)
{
{
static
bool
threadInit
=
false
;
#ifdef __android__
if
(
!
threadInit
)
{
Q_UNUSED
(
inText
);
threadInit
=
true
;
Q_UNUSED
(
severity
);
init
();
#else
}
static
bool
threadInit
=
false
;
if
(
!
threadInit
)
{
threadInit
=
true
;
init
();
}
if
(
!
muted
)
if
(
!
muted
)
{
{
QString
text
=
_
fixTextMessageForAudio
(
inText
);
QString
text
=
fixTextMessageForAudio
(
inText
);
// Prepend high priority text with alert beep
// Prepend high priority text with alert beep
if
(
severity
<
GAudioOutput
::
AUDIO_SEVERITY_CRITICAL
)
{
if
(
severity
<
GAudioOutput
::
AUDIO_SEVERITY_CRITICAL
)
{
beep
();
beep
();
...
@@ -115,35 +160,22 @@ void QGCAudioWorker::say(QString inText, int severity)
...
@@ -115,35 +160,22 @@ void QGCAudioWorker::say(QString inText, int severity)
#if defined _MSC_VER && defined QGC_SPEECH_ENABLED
#if defined _MSC_VER && defined QGC_SPEECH_ENABLED
HRESULT
hr
=
pVoice
->
Speak
(
text
.
toStdWString
().
c_str
(),
SPF_DEFAULT
,
NULL
);
HRESULT
hr
=
pVoice
->
Speak
(
text
.
toStdWString
().
c_str
(),
SPF_DEFAULT
,
NULL
);
if
(
FAILED
(
hr
))
{
if
(
FAILED
(
hr
))
{
qDebug
()
<<
"Speak failed, HR:"
<<
QString
(
"%1"
).
arg
(
hr
,
0
,
16
);
qDebug
()
<<
"Speak failed, HR:"
<<
QString
(
"%1"
).
arg
(
hr
,
0
,
16
);
}
}
#elif defined Q_OS_LINUX && defined QGC_SPEECH_ENABLED
#elif defined Q_OS_LINUX && defined QGC_SPEECH_ENABLED
// Set size of string for espeak: +1 for the null-character
// Set size of string for espeak: +1 for the null-character
unsigned
int
espeak_size
=
strlen
(
text
.
toStdString
().
c_str
())
+
1
;
unsigned
int
espeak_size
=
strlen
(
text
.
toStdString
().
c_str
())
+
1
;
espeak_Synth
(
text
.
toStdString
().
c_str
(),
espeak_size
,
0
,
POS_CHARACTER
,
0
,
espeakCHARS_AUTO
,
NULL
,
NULL
);
espeak_Synth
(
text
.
toStdString
().
c_str
(),
espeak_size
,
0
,
POS_CHARACTER
,
0
,
espeakCHARS_AUTO
,
NULL
,
NULL
);
#elif defined Q_OS_MAC && defined QGC_SPEECH_ENABLED
#elif defined Q_OS_MAC && defined QGC_SPEECH_ENABLED
// Slashes necessary to have the right start to the sentence
macSpeech
.
say
(
text
.
toStdString
().
c_str
());
// copying data prevents SpeakString from reading additional chars
text
=
"
\\
"
+
text
;
std
::
wstring
str
=
text
.
toStdWString
();
unsigned
char
str2
[
1024
]
=
{};
memcpy
(
str2
,
text
.
toLatin1
().
data
(),
str
.
length
());
SpeakString
(
str2
);
// Block the thread while busy
// because we run in our own thread, this doesn't
// halt the main application
while
(
SpeechBusy
())
{
QGC
::
SLEEP
::
msleep
(
100
);
}
#else
#else
// Make sure there isn't an unused variable warning when speech output is disabled
// Make sure there isn't an unused variable warning when speech output is disabled
Q_UNUSED
(
inText
);
Q_UNUSED
(
inText
);
#endif
#endif
}
}
#endif // __android__
}
}
void
QGCAudioWorker
::
mute
(
bool
mute
)
void
QGCAudioWorker
::
mute
(
bool
mute
)
...
@@ -187,7 +219,7 @@ bool QGCAudioWorker::_getMillisecondString(const QString& string, QString& match
...
@@ -187,7 +219,7 @@ bool QGCAudioWorker::_getMillisecondString(const QString& string, QString& match
return
false
;
return
false
;
}
}
QString
QGCAudioWorker
::
_
fixTextMessageForAudio
(
const
QString
&
string
)
{
QString
QGCAudioWorker
::
fixTextMessageForAudio
(
const
QString
&
string
)
{
QString
match
;
QString
match
;
QString
newNumber
;
QString
newNumber
;
QString
result
=
string
;
QString
result
=
string
;
...
@@ -204,7 +236,9 @@ QString QGCAudioWorker::_fixTextMessageForAudio(const QString& string) {
...
@@ -204,7 +236,9 @@ QString QGCAudioWorker::_fixTextMessageForAudio(const QString& string) {
if
(
result
.
contains
(
"ALTCTL"
,
Qt
::
CaseInsensitive
))
{
if
(
result
.
contains
(
"ALTCTL"
,
Qt
::
CaseInsensitive
))
{
result
.
replace
(
"ALTCTL"
,
"Altitude Control"
,
Qt
::
CaseInsensitive
);
result
.
replace
(
"ALTCTL"
,
"Altitude Control"
,
Qt
::
CaseInsensitive
);
}
}
if
(
result
.
contains
(
"RTL"
,
Qt
::
CaseInsensitive
))
{
if
(
result
.
contains
(
"AUTO_RTL"
,
Qt
::
CaseInsensitive
))
{
result
.
replace
(
"AUTO_RTL"
,
"auto Return To Land"
,
Qt
::
CaseInsensitive
);
}
else
if
(
result
.
contains
(
"RTL"
,
Qt
::
CaseInsensitive
))
{
result
.
replace
(
"RTL"
,
"Return To Land"
,
Qt
::
CaseInsensitive
);
result
.
replace
(
"RTL"
,
"Return To Land"
,
Qt
::
CaseInsensitive
);
}
}
if
(
result
.
contains
(
"ACCEL "
,
Qt
::
CaseInsensitive
))
{
if
(
result
.
contains
(
"ACCEL "
,
Qt
::
CaseInsensitive
))
{
...
...
src/audio/QGCAudioWorker.h
View file @
7abe60d1
...
@@ -7,13 +7,6 @@
...
@@ -7,13 +7,6 @@
#include <QSound>
#include <QSound>
#endif
#endif
/* For Snow leopard and later
#if defined Q_OS_MAC & defined QGC_SPEECH_ENABLED
#include <NSSpeechSynthesizer.h>
#endif
*/
#if defined _MSC_VER && defined QGC_SPEECH_ENABLED
#if defined _MSC_VER && defined QGC_SPEECH_ENABLED
// Documentation: http://msdn.microsoft.com/en-us/library/ee125082%28v=VS.85%29.aspx
// Documentation: http://msdn.microsoft.com/en-us/library/ee125082%28v=VS.85%29.aspx
#include <basetyps.h>
#include <basetyps.h>
...
@@ -31,6 +24,8 @@ public:
...
@@ -31,6 +24,8 @@ public:
bool
isMuted
();
bool
isMuted
();
void
init
();
void
init
();
static
QString
fixTextMessageForAudio
(
const
QString
&
string
);
signals:
signals:
public
slots
:
public
slots
:
...
@@ -52,8 +47,7 @@ protected:
...
@@ -52,8 +47,7 @@ protected:
QTimer
*
emergencyTimer
;
QTimer
*
emergencyTimer
;
bool
muted
;
bool
muted
;
private:
private:
QString
_fixTextMessageForAudio
(
const
QString
&
string
);
static
bool
_getMillisecondString
(
const
QString
&
string
,
QString
&
match
,
int
&
number
);
bool
_getMillisecondString
(
const
QString
&
string
,
QString
&
match
,
int
&
number
);
};
};
#endif // QGCAUDIOWORKER_H
#endif // QGCAUDIOWORKER_H
src/uas/UAS.cc
View file @
7abe60d1
This diff is collapsed.
Click to expand it.
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment