Browse Source

Improve the logging on the JNI/C++ bindings and document which API versions each implementation targets

master
Reece H. Dunn 12 years ago
parent
commit
dfbfec4e05

+ 8
- 8
jni/include/TtsEngine.h View File

@@ -1,5 +1,6 @@
/*
* Copyright (C) 2009 Google Inc.
* Copyright (C) 2012 Reece H. Dunn
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -14,14 +15,13 @@
* limitations under the License.
*/

// This header defines the interface used by the Android platform
// to access Text-To-Speech functionality in shared libraries that implement
// speech synthesis and the management of resources associated with the
// synthesis.
// An example of the implementation of this interface can be found in
// FIXME: add path+name to implementation of default TTS engine
// Libraries implementing this interface are used in:
// frameworks/base/tts/jni/android_tts_SpeechSynthesis.cpp
/*
* This file contains the TtsEngine interface used by Android to implement
* Text-to-Speech services.
*
* Android Version: 2.2 (Froyo)
* API Version: 8
*/

#ifndef TTS_ENGINE_H_
#define TTS_ENGINE_H_

+ 26
- 6
jni/jni/com_google_espeakengine.cpp View File

@@ -1,5 +1,6 @@
/*
* Copyright (C) 2008 Google Inc.
* Copyright (C) 2012 Reece H. Dunn
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -14,11 +15,21 @@
* limitations under the License.
*/

/*
* This file contains the TtsEngine implementation for the eSpeak
* Text-to-Speech engine.
*
* Android Version: 2.2 (Froyo)
* API Version: 8
*/


#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>

#define LOG_TAG "eSpeak Engine"
#define DEBUG true

#include <speak_lib.h>
#include <TtsEngine.h>
@@ -152,6 +163,7 @@ static int eSpeakCallback(short *wav, int numsamples, espeak_EVENT *events) {
}

static bool fileExists(char *fileName) {
if (DEBUG) LOGV("%s", __FUNCTION__);
FILE *file = fopen(fileName, "r");

if (file == NULL) {
@@ -163,6 +175,7 @@ static bool fileExists(char *fileName) {
}

static bool hasBaseResources() {
if (DEBUG) LOGV("%s", __FUNCTION__);
char filename[255];

for (int i = 0; i < NUM_BASE_RESOURCES; i++) {
@@ -180,6 +193,7 @@ static bool hasBaseResources() {
/* Google Engine API function implementations */

tts_result attemptInit() {
if (DEBUG) LOGV("%s", __FUNCTION__);
if (hasInitialized) {
return TTS_SUCCESS;
}
@@ -219,6 +233,7 @@ tts_result attemptInit() {
* return tts_result
*/
tts_result TtsEngine::init(synthDoneCB_t synthDoneCBPtr, const char *engineConfig) {
if (DEBUG) LOGV("%s", __FUNCTION__);
ttsSynthDoneCBPointer = synthDoneCBPtr;
hasInitialized = false;

@@ -239,6 +254,7 @@ tts_result TtsEngine::init(synthDoneCB_t synthDoneCBPtr, const char *engineConfi
* return tts_result
*/
tts_result TtsEngine::shutdown(void) {
if (DEBUG) LOGV("%s", __FUNCTION__);
if (eSpeakDataPath != NULL) {
free(eSpeakDataPath);
}
@@ -249,14 +265,14 @@ tts_result TtsEngine::shutdown(void) {
}

tts_result TtsEngine::loadLanguage(const char *lang, const char *country, const char *variant) {
LOGV("loadLanguage(\"%s\", \"%s\", \"%s\")", lang, country, variant);
if (DEBUG) LOGV("loadLanguage(\"%s\", \"%s\", \"%s\")", lang, country, variant);

return TTS_FAILURE;
}

tts_support_result isLanguageSupported(const char *lang, const char *country, const char *variant,
int *pindex) {
LOGV("isLanguageSupported(\"%s\", \"%s\", \"%s\")", lang, country, variant);
if (DEBUG) LOGV("isLanguageSupported(\"%s\", \"%s\", \"%s\")", lang, country, variant);

if ((lang == NULL) || (strlen(lang) == 0)) {
LOGE("TtsEngine::isLanguageAvailable called with no language");
@@ -375,7 +391,7 @@ tts_support_result isLanguageSupported(const char *lang, const char *country, co
}

tts_result TtsEngine::setLanguage(const char *lang, const char *country, const char *variant) {
LOGV("setLanguage(\"%s\", \"%s\", \"%s\")", lang, country, variant);
if (DEBUG) LOGV("setLanguage(\"%s\", \"%s\", \"%s\")", lang, country, variant);

// Make sure the engine is initialized!
attemptInit();
@@ -414,10 +430,12 @@ tts_result TtsEngine::setLanguage(const char *lang, const char *country, const c

tts_support_result TtsEngine::isLanguageAvailable(const char *lang, const char *country,
const char *variant) {
if (DEBUG) LOGV("%s", __FUNCTION__);
return isLanguageSupported(lang, country, variant, NULL);
}

tts_result TtsEngine::getLanguage(char *language, char *country, char *variant) {
if (DEBUG) LOGV("%s", __FUNCTION__);
strcpy(language, currentLang);
strcpy(country, currentCountry);
strcpy(variant, currentVariant);
@@ -441,7 +459,7 @@ tts_result TtsEngine::setAudioFormat(tts_audio_format& encoding, uint32_t& rate,

// Sets the property with the specified value
tts_result TtsEngine::setProperty(const char *property, const char *value, const size_t size) {
LOGV("setProperty(\"%s\", \"%s\", %d)", property, value, size);
if (DEBUG) LOGV("setProperty(\"%s\", \"%s\", %d)", property, value, size);

/* Set a specific property for the engine.
Supported properties include: language (locale), rate, pitch, volume. */
@@ -483,7 +501,7 @@ tts_result TtsEngine::setProperty(const char *property, const char *value, const

// Sets the property with the specified value
tts_result TtsEngine::getProperty(const char *property, char *value, size_t *iosize) {
LOGV("getProperty(\"%s\", ...)", property);
if (DEBUG) LOGV("getProperty(\"%s\", ...)", property);

/* Get the property for the engine.
This property was previously set by setProperty or by default. */
@@ -554,7 +572,7 @@ tts_result TtsEngine::getProperty(const char *property, char *value, size_t *ios
*/
tts_result TtsEngine::synthesizeText(const char *text, int8_t *buffer, size_t bufferSize,
void *userdata) {
LOGI("Synthesize: %s", text);
if (DEBUG) LOGV("%s", __FUNCTION__);

espeak_SetSynthCallback(eSpeakCallback);

@@ -576,6 +594,7 @@ tts_result TtsEngine::synthesizeText(const char *text, int8_t *buffer, size_t bu
* return tts_result
*/
tts_result TtsEngine::stop() {
if (DEBUG) LOGV("%s", __FUNCTION__);
espeak_Cancel();
return TTS_SUCCESS;
}
@@ -585,6 +604,7 @@ extern "C" {
#endif

TtsEngine* getTtsEngine() {
if (DEBUG) LOGV("%s", __FUNCTION__);
return new TtsEngine();
}


+ 14
- 4
jni/jni/com_googlecode_eyesfree_espeak_eSpeakService.cpp View File

@@ -1,5 +1,6 @@
/*
* Copyright (C) 2011 Google Inc.
* Copyright (C) 2012 Reece H. Dunn
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -14,6 +15,13 @@
* limitations under the License.
*/

/*
* This file contains the JNI bindings to eSpeak used by SpeechSynthesis.java.
*
* Android Version: 4.0 (Ice Cream Sandwich)
* API Version: 14
*/

#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
@@ -24,7 +32,7 @@
#include <Log.h>

#define LOG_TAG "eSpeakService"
#define DEBUG false
#define DEBUG true

enum audio_channel_count {
CHANNEL_COUNT_MONO = 1,
@@ -234,11 +242,11 @@ JNIEXPORT jboolean
JNICALL Java_com_googlecode_eyesfree_espeak_SpeechSynthesis_nativeSetVoiceByProperties(
JNIEnv *env, jobject object, jstring name, jstring languages, jint gender, jint age,
jint variant) {
if (DEBUG) LOGV("%s", __FUNCTION__);

const char *c_name = env->GetStringUTFChars(name, NULL);
const char *c_languages = env->GetStringUTFChars(languages, NULL);

if (DEBUG) LOGV("%s(name=%s, languages=%s)", __FUNCTION__, c_name, c_languages);

espeak_VOICE voice_select;
memset(&voice_select, 0, sizeof(espeak_VOICE));

@@ -262,8 +270,10 @@ JNICALL Java_com_googlecode_eyesfree_espeak_SpeechSynthesis_nativeSetVoiceByProp
JNIEXPORT jboolean
JNICALL Java_com_googlecode_eyesfree_espeak_SpeechSynthesis_nativeSetLanguage(
JNIEnv *env, jobject object, jstring language, jint variant) {
if (DEBUG) LOGV("%s", __FUNCTION__);
const char *c_language = env->GetStringUTFChars(language, NULL);

if (DEBUG) LOGV("%s(language=%s)", __FUNCTION__, c_language);

const int len = strlen(c_language);
char *lang_copy = (char *) calloc(len, sizeof(char));
strcpy(lang_copy, c_language);

+ 7
- 0
src/com/googlecode/eyesfree/espeak/SpeechSynthesis.java View File

@@ -14,6 +14,13 @@
* limitations under the License.
*/

/*
* This file implements the Java API to eSpeak using the JNI bindings.
*
* Android Version: 4.0 (Ice Cream Sandwich)
* API Version: 14
*/

package com.googlecode.eyesfree.espeak;

import android.content.Context;

+ 9
- 0
src/com/googlecode/eyesfree/espeak/TtsService.java View File

@@ -14,8 +14,16 @@
* limitations under the License.
*/

/*
* This file implements the Android Text-to-Speech engine for eSpeak.
*
* Android Version: 4.0 (Ice Cream Sandwich)
* API Version: 14
*/

package com.googlecode.eyesfree.espeak;

import android.annotation.SuppressLint;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
@@ -42,6 +50,7 @@ import java.util.Locale;
*
* @author [email protected] (Alan Viverette)
*/
@SuppressLint("NewApi")
public class TtsService extends TextToSpeechService {
private static final String TAG = TtsService.class.getSimpleName();
private static final boolean DEBUG = false;

Loading…
Cancel
Save