[Sound-open-firmware] [PATCH v3 07/27] intel-ipc: add stream operation IPC_INTEL_STR_STOP

Keyon Jie yang.jie at linux.intel.com
Sat Feb 11 03:17:47 CET 2017


It used IPC_INTEL_STR_PAUSE plus IPC_INTEL_STR_RESET to stop a
stream, but sometimes we application only intend to stop the
stream(e.g. speaker-test with large buffer size( > .wav file
size)), which means we only reset the buffer pointers but don't
need set params again(for reset, we need set params again).

Here add this stream operation IPC_INTEL_STR_STOP to handle
this case.

Signed-off-by: Keyon Jie <yang.jie at linux.intel.com>
---
 src/include/uapi/intel-ipc.h |  1 +
 src/ipc/intel-ipc.c          | 35 +++++++++++++++++++++++++++++++++++
 2 files changed, 36 insertions(+)

diff --git a/src/include/uapi/intel-ipc.h b/src/include/uapi/intel-ipc.h
index a4589b3..5fae423 100644
--- a/src/include/uapi/intel-ipc.h
+++ b/src/include/uapi/intel-ipc.h
@@ -182,6 +182,7 @@ enum ipc_str_operation {
 	IPC_INTEL_STR_RESUME = 2,
 	IPC_INTEL_STR_STAGE_MESSAGE = 3,
 	IPC_INTEL_STR_NOTIFICATION = 4,
+	IPC_INTEL_STR_STOP = 5,
 	IPC_INTEL_STR_MAX_MESSAGE
 };
 
diff --git a/src/ipc/intel-ipc.c b/src/ipc/intel-ipc.c
index f192917..7db4179 100644
--- a/src/ipc/intel-ipc.c
+++ b/src/ipc/intel-ipc.c
@@ -811,6 +811,39 @@ error:
 	return IPC_INTEL_GLB_REPLY_ERROR_INVALID_PARAM;
 }
 
+static uint32_t ipc_stream_stop(uint32_t header)
+{
+	struct ipc_pcm_dev *pcm_dev;
+	uint32_t stream_id;
+	int err;
+
+	trace_ipc("SSt");
+
+	stream_id = header & IPC_INTEL_STR_ID_MASK;
+	stream_id >>= IPC_INTEL_STR_ID_SHIFT;
+
+	/* get the pcm_dev */
+	pcm_dev = ipc_get_pcm_comp(stream_id);
+	if (pcm_dev == NULL) {
+		trace_ipc_error("erg");
+		goto error;
+	}
+
+	/* send stop TODO: this should be done in trigger */
+	err = pipeline_cmd(pcm_dev->dev.p, pcm_dev->dev.cd,
+		COMP_CMD_STOP, NULL);
+	if (err < 0) {
+		trace_ipc_error("erc");
+		goto error;
+	}
+
+	/* need prepare again before next start */
+	pcm_dev->state = IPC_HOST_ALLOC;
+	return IPC_INTEL_GLB_REPLY_SUCCESS;
+error:
+	return IPC_INTEL_GLB_REPLY_ERROR_INVALID_PARAM;
+}
+
 static uint32_t ipc_stream_pause(uint32_t header)
 {
 	struct ipc_pcm_dev *pcm_dev;
@@ -905,6 +938,8 @@ static uint32_t ipc_stream_message(uint32_t header)
 		return ipc_stream_reset(header);
 	case IPC_INTEL_STR_PAUSE:
 		return ipc_stream_pause(header);
+	case IPC_INTEL_STR_STOP:
+		return ipc_stream_stop(header);
 	case IPC_INTEL_STR_RESUME:
 		return ipc_stream_resume(header);
 	case IPC_INTEL_STR_STAGE_MESSAGE:
-- 
2.7.4



More information about the Sound-open-firmware mailing list