ex

Fork of mbed-os-example-mbed5-blinky by mbed-os-examples

Committer:
TMBOY
Date:
Tue Jul 18 16:34:48 2017 +0800
Revision:
45:2aa9f933c8d2
?

Who changed what in which revision?

UserRevisionLine numberNew contents of line
TMBOY 45:2aa9f933c8d2 1 /*
TMBOY 45:2aa9f933c8d2 2 * Copyright (c) 2017 Baidu, Inc. All Rights Reserved.
TMBOY 45:2aa9f933c8d2 3 *
TMBOY 45:2aa9f933c8d2 4 * Licensed under the Apache License, Version 2.0 (the "License");
TMBOY 45:2aa9f933c8d2 5 * you may not use this file except in compliance with the License.
TMBOY 45:2aa9f933c8d2 6 * You may obtain a copy of the License at
TMBOY 45:2aa9f933c8d2 7 *
TMBOY 45:2aa9f933c8d2 8 * http://www.apache.org/licenses/LICENSE-2.0
TMBOY 45:2aa9f933c8d2 9 *
TMBOY 45:2aa9f933c8d2 10 * Unless required by applicable law or agreed to in writing, software
TMBOY 45:2aa9f933c8d2 11 * distributed under the License is distributed on an "AS IS" BASIS,
TMBOY 45:2aa9f933c8d2 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
TMBOY 45:2aa9f933c8d2 13 * See the License for the specific language governing permissions and
TMBOY 45:2aa9f933c8d2 14 * limitations under the License.
TMBOY 45:2aa9f933c8d2 15 */
TMBOY 45:2aa9f933c8d2 16 package com.baidu.duer.dcs.devicemodule.voiceinput;
TMBOY 45:2aa9f933c8d2 17
TMBOY 45:2aa9f933c8d2 18 import com.baidu.duer.dcs.devicemodule.system.HandleDirectiveException;
TMBOY 45:2aa9f933c8d2 19 import com.baidu.duer.dcs.devicemodule.voiceinput.message.ListenStartedPayload;
TMBOY 45:2aa9f933c8d2 20 import com.baidu.duer.dcs.framework.BaseDeviceModule;
TMBOY 45:2aa9f933c8d2 21 import com.baidu.duer.dcs.framework.DcsResponseDispatcher;
TMBOY 45:2aa9f933c8d2 22 import com.baidu.duer.dcs.framework.DialogRequestIdHandler;
TMBOY 45:2aa9f933c8d2 23 import com.baidu.duer.dcs.framework.IMessageSender;
TMBOY 45:2aa9f933c8d2 24 import com.baidu.duer.dcs.framework.IResponseListener;
TMBOY 45:2aa9f933c8d2 25 import com.baidu.duer.dcs.framework.message.ClientContext;
TMBOY 45:2aa9f933c8d2 26 import com.baidu.duer.dcs.framework.message.DcsStreamRequestBody;
TMBOY 45:2aa9f933c8d2 27 import com.baidu.duer.dcs.framework.message.DialogRequestIdHeader;
TMBOY 45:2aa9f933c8d2 28 import com.baidu.duer.dcs.framework.message.Directive;
TMBOY 45:2aa9f933c8d2 29 import com.baidu.duer.dcs.framework.message.Event;
TMBOY 45:2aa9f933c8d2 30 import com.baidu.duer.dcs.framework.message.Payload;
TMBOY 45:2aa9f933c8d2 31 import com.baidu.duer.dcs.systeminterface.IAudioInput;
TMBOY 45:2aa9f933c8d2 32 import com.baidu.duer.dcs.systeminterface.IMediaPlayer;
TMBOY 45:2aa9f933c8d2 33 import com.baidu.duer.dcs.util.LogUtil;
TMBOY 45:2aa9f933c8d2 34
TMBOY 45:2aa9f933c8d2 35 import java.util.ArrayList;
TMBOY 45:2aa9f933c8d2 36 import java.util.Collections;
TMBOY 45:2aa9f933c8d2 37 import java.util.List;
TMBOY 45:2aa9f933c8d2 38
TMBOY 45:2aa9f933c8d2 39 /**
TMBOY 45:2aa9f933c8d2 40 * Voice Input模块处理并执行服务下发的StopListen、Listen指令,上报ListenStarted、ListenTimedOut事件
TMBOY 45:2aa9f933c8d2 41 * <p>
TMBOY 45:2aa9f933c8d2 42 * Created by wuruisheng on 2017/5/31.
TMBOY 45:2aa9f933c8d2 43 */
TMBOY 45:2aa9f933c8d2 44 public class VoiceInputDeviceModule extends BaseDeviceModule {
TMBOY 45:2aa9f933c8d2 45 public static final String TAG = VoiceInputDeviceModule.class.getSimpleName();
TMBOY 45:2aa9f933c8d2 46 private final IAudioInput audioInput;
TMBOY 45:2aa9f933c8d2 47 private final List<IVoiceInputListener> voiceInputListeners;
TMBOY 45:2aa9f933c8d2 48 private final IMediaPlayer mediaPlayer;
TMBOY 45:2aa9f933c8d2 49 private final DialogRequestIdHandler dialogRequestIdHandler;
TMBOY 45:2aa9f933c8d2 50 private final DcsResponseDispatcher dcsResponseDispatcher;
TMBOY 45:2aa9f933c8d2 51
TMBOY 45:2aa9f933c8d2 52 public VoiceInputDeviceModule(final IMediaPlayer mediaPlayer,
TMBOY 45:2aa9f933c8d2 53 IMessageSender messageSender,
TMBOY 45:2aa9f933c8d2 54 final IAudioInput audioInput,
TMBOY 45:2aa9f933c8d2 55 DialogRequestIdHandler dialogRequestIdHandler,
TMBOY 45:2aa9f933c8d2 56 DcsResponseDispatcher dcsResponseDispatcher) {
TMBOY 45:2aa9f933c8d2 57 super(ApiConstants.NAMESPACE, messageSender);
TMBOY 45:2aa9f933c8d2 58 this.audioInput = audioInput;
TMBOY 45:2aa9f933c8d2 59 this.voiceInputListeners = Collections.synchronizedList(new ArrayList<IVoiceInputListener>());
TMBOY 45:2aa9f933c8d2 60 this.mediaPlayer = mediaPlayer;
TMBOY 45:2aa9f933c8d2 61 this.dialogRequestIdHandler = dialogRequestIdHandler;
TMBOY 45:2aa9f933c8d2 62 this.dcsResponseDispatcher = dcsResponseDispatcher;
TMBOY 45:2aa9f933c8d2 63
TMBOY 45:2aa9f933c8d2 64 this.audioInput.registerAudioInputListener(new IAudioInput.IAudioInputListener() {
TMBOY 45:2aa9f933c8d2 65 @Override
TMBOY 45:2aa9f933c8d2 66 public void onStartRecord(DcsStreamRequestBody dcsStreamRequestBody) {
TMBOY 45:2aa9f933c8d2 67 stopSpeaker();
TMBOY 45:2aa9f933c8d2 68 // 发送网络请求
TMBOY 45:2aa9f933c8d2 69 sendListenStartedEvent(dcsStreamRequestBody, new IResponseListener() {
TMBOY 45:2aa9f933c8d2 70 @Override
TMBOY 45:2aa9f933c8d2 71 public void onSucceed(int statusCode) {
TMBOY 45:2aa9f933c8d2 72 fireOnSucceed(statusCode);
TMBOY 45:2aa9f933c8d2 73 // 没有下发新的语音speak-stream
TMBOY 45:2aa9f933c8d2 74 if (statusCode == 204) {
TMBOY 45:2aa9f933c8d2 75 // 设置对话通道为非活跃状态
TMBOY 45:2aa9f933c8d2 76 mediaPlayer.setActive(false);
TMBOY 45:2aa9f933c8d2 77 } else {
TMBOY 45:2aa9f933c8d2 78 mediaPlayer.setActive(true);
TMBOY 45:2aa9f933c8d2 79 }
TMBOY 45:2aa9f933c8d2 80 }
TMBOY 45:2aa9f933c8d2 81
TMBOY 45:2aa9f933c8d2 82 @Override
TMBOY 45:2aa9f933c8d2 83 public void onFailed(String errorMessage) {
TMBOY 45:2aa9f933c8d2 84 LogUtil.d(TAG, "onFailed,errorMessage:" + errorMessage);
TMBOY 45:2aa9f933c8d2 85 fireOnFailed(errorMessage);
TMBOY 45:2aa9f933c8d2 86 audioInput.stopRecord();
TMBOY 45:2aa9f933c8d2 87 mediaPlayer.setActive(false);
TMBOY 45:2aa9f933c8d2 88 }
TMBOY 45:2aa9f933c8d2 89 });
TMBOY 45:2aa9f933c8d2 90
TMBOY 45:2aa9f933c8d2 91 fireOnStartRecord();
TMBOY 45:2aa9f933c8d2 92 }
TMBOY 45:2aa9f933c8d2 93
TMBOY 45:2aa9f933c8d2 94 @Override
TMBOY 45:2aa9f933c8d2 95 public void onStopRecord() {
TMBOY 45:2aa9f933c8d2 96 fireFinishRecord();
TMBOY 45:2aa9f933c8d2 97 }
TMBOY 45:2aa9f933c8d2 98 });
TMBOY 45:2aa9f933c8d2 99 }
TMBOY 45:2aa9f933c8d2 100
TMBOY 45:2aa9f933c8d2 101
TMBOY 45:2aa9f933c8d2 102 @Override
TMBOY 45:2aa9f933c8d2 103 public ClientContext clientContext() {
TMBOY 45:2aa9f933c8d2 104 return null;
TMBOY 45:2aa9f933c8d2 105 }
TMBOY 45:2aa9f933c8d2 106
TMBOY 45:2aa9f933c8d2 107 @Override
TMBOY 45:2aa9f933c8d2 108 public void handleDirective(Directive directive) throws HandleDirectiveException {
TMBOY 45:2aa9f933c8d2 109 String name = directive.getName();
TMBOY 45:2aa9f933c8d2 110 if (name.equals(ApiConstants.Directives.StopListen.NAME)) {
TMBOY 45:2aa9f933c8d2 111 audioInput.stopRecord();
TMBOY 45:2aa9f933c8d2 112 } else if (name.equals(ApiConstants.Directives.Listen.NAME)) {
TMBOY 45:2aa9f933c8d2 113 audioInput.startRecord();
TMBOY 45:2aa9f933c8d2 114 } else {
TMBOY 45:2aa9f933c8d2 115 String message = "No device to handle the directive";
TMBOY 45:2aa9f933c8d2 116 throw new HandleDirectiveException(
TMBOY 45:2aa9f933c8d2 117 HandleDirectiveException.ExceptionType.UNSUPPORTED_OPERATION,
TMBOY 45:2aa9f933c8d2 118 message);
TMBOY 45:2aa9f933c8d2 119 }
TMBOY 45:2aa9f933c8d2 120 }
TMBOY 45:2aa9f933c8d2 121
TMBOY 45:2aa9f933c8d2 122 @Override
TMBOY 45:2aa9f933c8d2 123 public void release() {
TMBOY 45:2aa9f933c8d2 124 voiceInputListeners.clear();
TMBOY 45:2aa9f933c8d2 125 }
TMBOY 45:2aa9f933c8d2 126
TMBOY 45:2aa9f933c8d2 127 /**
TMBOY 45:2aa9f933c8d2 128 * 停止speaker对话通道的语音播放
TMBOY 45:2aa9f933c8d2 129 */
TMBOY 45:2aa9f933c8d2 130 private void stopSpeaker() {
TMBOY 45:2aa9f933c8d2 131 mediaPlayer.setActive(true);
TMBOY 45:2aa9f933c8d2 132 mediaPlayer.stop();
TMBOY 45:2aa9f933c8d2 133 dcsResponseDispatcher.interruptDispatch();
TMBOY 45:2aa9f933c8d2 134 }
TMBOY 45:2aa9f933c8d2 135
TMBOY 45:2aa9f933c8d2 136 private void sendListenStartedEvent(DcsStreamRequestBody streamRequestBody, IResponseListener responseListener) {
TMBOY 45:2aa9f933c8d2 137 String dialogRequestId = dialogRequestIdHandler.createActiveDialogRequestId();
TMBOY 45:2aa9f933c8d2 138 String name = ApiConstants.Events.ListenStarted.NAME;
TMBOY 45:2aa9f933c8d2 139 DialogRequestIdHeader header = new DialogRequestIdHeader(getNameSpace(), name, dialogRequestId);
TMBOY 45:2aa9f933c8d2 140 Payload payload = new ListenStartedPayload(ListenStartedPayload.FORMAT);
TMBOY 45:2aa9f933c8d2 141 Event event = new Event(header, payload);
TMBOY 45:2aa9f933c8d2 142 messageSender.sendEvent(event, streamRequestBody, responseListener);
TMBOY 45:2aa9f933c8d2 143 }
TMBOY 45:2aa9f933c8d2 144
TMBOY 45:2aa9f933c8d2 145 private void fireOnStartRecord() {
TMBOY 45:2aa9f933c8d2 146 for (IVoiceInputListener listener : voiceInputListeners) {
TMBOY 45:2aa9f933c8d2 147 listener.onStartRecord();
TMBOY 45:2aa9f933c8d2 148 }
TMBOY 45:2aa9f933c8d2 149 }
TMBOY 45:2aa9f933c8d2 150
TMBOY 45:2aa9f933c8d2 151 private void fireFinishRecord() {
TMBOY 45:2aa9f933c8d2 152 for (IVoiceInputListener listener : voiceInputListeners) {
TMBOY 45:2aa9f933c8d2 153 listener.onFinishRecord();
TMBOY 45:2aa9f933c8d2 154 }
TMBOY 45:2aa9f933c8d2 155 }
TMBOY 45:2aa9f933c8d2 156
TMBOY 45:2aa9f933c8d2 157 private void fireOnSucceed(int statusCode) {
TMBOY 45:2aa9f933c8d2 158 for (IVoiceInputListener listener : voiceInputListeners) {
TMBOY 45:2aa9f933c8d2 159 listener.onSucceed(statusCode);
TMBOY 45:2aa9f933c8d2 160 }
TMBOY 45:2aa9f933c8d2 161 }
TMBOY 45:2aa9f933c8d2 162
TMBOY 45:2aa9f933c8d2 163 private void fireOnFailed(String errorMessage) {
TMBOY 45:2aa9f933c8d2 164 for (IVoiceInputListener listener : voiceInputListeners) {
TMBOY 45:2aa9f933c8d2 165 listener.onFailed(errorMessage);
TMBOY 45:2aa9f933c8d2 166 }
TMBOY 45:2aa9f933c8d2 167 }
TMBOY 45:2aa9f933c8d2 168
TMBOY 45:2aa9f933c8d2 169 public void addVoiceInputListener(IVoiceInputListener listener) {
TMBOY 45:2aa9f933c8d2 170 this.voiceInputListeners.add(listener);
TMBOY 45:2aa9f933c8d2 171 }
TMBOY 45:2aa9f933c8d2 172
TMBOY 45:2aa9f933c8d2 173 public interface IVoiceInputListener {
TMBOY 45:2aa9f933c8d2 174 /**
TMBOY 45:2aa9f933c8d2 175 * 开始录音的回调
TMBOY 45:2aa9f933c8d2 176 */
TMBOY 45:2aa9f933c8d2 177 void onStartRecord();
TMBOY 45:2aa9f933c8d2 178
TMBOY 45:2aa9f933c8d2 179 /**
TMBOY 45:2aa9f933c8d2 180 * 结束录音的回调
TMBOY 45:2aa9f933c8d2 181 */
TMBOY 45:2aa9f933c8d2 182 void onFinishRecord();
TMBOY 45:2aa9f933c8d2 183
TMBOY 45:2aa9f933c8d2 184 /**
TMBOY 45:2aa9f933c8d2 185 * 录音-网络请求成功
TMBOY 45:2aa9f933c8d2 186 *
TMBOY 45:2aa9f933c8d2 187 * @param statusCode 网络返回状态码
TMBOY 45:2aa9f933c8d2 188 */
TMBOY 45:2aa9f933c8d2 189 void onSucceed(int statusCode);
TMBOY 45:2aa9f933c8d2 190
TMBOY 45:2aa9f933c8d2 191 /**
TMBOY 45:2aa9f933c8d2 192 * 录音-网络请求失败
TMBOY 45:2aa9f933c8d2 193 *
TMBOY 45:2aa9f933c8d2 194 * @param errorMessage 错误信息
TMBOY 45:2aa9f933c8d2 195 */
TMBOY 45:2aa9f933c8d2 196 void onFailed(String errorMessage);
TMBOY 45:2aa9f933c8d2 197 }
TMBOY 45:2aa9f933c8d2 198 }