You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@nuttx.apache.org by xi...@apache.org on 2023/10/27 13:01:07 UTC

(nuttx-apps) branch master updated: system/nxrecorder: add amr offload record support

This is an automated email from the ASF dual-hosted git repository.

xiaoxiang pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/nuttx-apps.git


The following commit(s) were added to refs/heads/master by this push:
     new 518b1aea6 system/nxrecorder: add amr offload record support
518b1aea6 is described below

commit 518b1aea61e63c63c73964022b91549d5afd0b82
Author: jinxiuxu <ji...@xiaomi.com>
AuthorDate: Tue Oct 24 20:25:14 2023 +0800

    system/nxrecorder: add amr offload record support
    
    Signed-off-by: jinxiuxu <ji...@xiaomi.com>
---
 include/system/nxrecorder.h           | 45 +++++++++++++++++++++++
 system/nxrecorder/CMakeLists.txt      |  4 +++
 system/nxrecorder/Makefile            |  5 +--
 system/nxrecorder/nxrecorder.c        | 44 +++++++++++++++++++++--
 system/nxrecorder/nxrecorder_amr.c    | 67 +++++++++++++++++++++++++++++++++++
 system/nxrecorder/nxrecorder_common.c | 67 +++++++++++++++++++++++++++++++++++
 6 files changed, 228 insertions(+), 4 deletions(-)

diff --git a/include/system/nxrecorder.h b/include/system/nxrecorder.h
index 4a2d127a3..4b2c2ac96 100644
--- a/include/system/nxrecorder.h
+++ b/include/system/nxrecorder.h
@@ -38,6 +38,14 @@
  * Public Type Declarations
  ****************************************************************************/
 
+struct nxrecorder_enc_ops_s
+{
+  int format;
+  CODE int (*pre_write)(int fd, uint32_t samplerate,
+                        uint8_t chans, uint8_t bps);
+  CODE int (*write_data)(int fd, struct ap_buffer_s *apb);
+};
+
 /* This structure describes the internal state of the NxRecorder */
 
 struct nxrecorder_s
@@ -54,6 +62,8 @@ struct nxrecorder_s
 #ifdef CONFIG_AUDIO_MULTI_SESSION
   FAR void        *session;                /* Session assignment from device */
 #endif
+
+  FAR const struct nxrecorder_enc_ops_s *ops;
 };
 
 typedef int (*nxrecorder_func)(FAR struct nxrecorder_s *precorder,
@@ -229,6 +239,41 @@ int nxrecorder_pause(FAR struct nxrecorder_s *precorder);
 int nxrecorder_resume(FAR struct nxrecorder_s *precorder);
 #endif
 
+/****************************************************************************
+ * Name: nxrecorder_write_amr
+ *
+ *   Performs pre-process when record amr file.
+ *
+ * Input Parameters:
+ *   fd         - recording file descriptor
+ *   samplerate - sample rate
+ *   chans      - channels num
+ *   bps        - bit width
+ *
+ * Returned Value:
+ *   OK if file writed successfully.
+ *
+ ****************************************************************************/
+
+int nxrecorder_write_amr(int fd, uint32_t samplerate,
+                         uint8_t chans, uint8_t bps);
+
+/****************************************************************************
+ * Name: nxrecorder_write_common
+ *
+ *   Performs common function to write apb buffer to FILE
+ *
+ * Input Parameters:
+ *   fd     - recording file descriptor
+ *   apb    - apb buffer
+ *
+ * Returned Value:
+ *   OK if apb buffer write successfully.
+ *
+ ****************************************************************************/
+
+int nxrecorder_write_common(int fd, FAR struct ap_buffer_s *apb);
+
 #undef EXTERN
 #ifdef __cplusplus
 }
diff --git a/system/nxrecorder/CMakeLists.txt b/system/nxrecorder/CMakeLists.txt
index 365f778af..5f43d4e75 100644
--- a/system/nxrecorder/CMakeLists.txt
+++ b/system/nxrecorder/CMakeLists.txt
@@ -24,4 +24,8 @@ if(CONFIG_SYSTEM_NXRECORDER)
                           ${CONFIG_NXRECORDER_MAINTHREAD_STACKSIZE})
   endif()
   target_sources(apps PRIVATE nxrecorder.c)
+
+  set(CSRCS nxrecorder.c nxrecorder_common.c nxrecorder_amr.c)
+
+  target_sources(apps PRIVATE ${CSRCS})
 endif()
diff --git a/system/nxrecorder/Makefile b/system/nxrecorder/Makefile
index f7eb66542..2a2f6d09f 100644
--- a/system/nxrecorder/Makefile
+++ b/system/nxrecorder/Makefile
@@ -22,8 +22,9 @@ include $(APPDIR)/Make.defs
 
 # NxRecorder Library
 
-CSRCS = nxrecorder.c
-
+CSRCS     = nxrecorder.c
+CSRCS    += nxrecorder_amr.c
+CSRCS    += nxrecorder_common.c
 
 ifneq ($(CONFIG_NXRECORDER_COMMAND_LINE),)
 PROGNAME = nxrecorder
diff --git a/system/nxrecorder/nxrecorder.c b/system/nxrecorder/nxrecorder.c
index de6051857..674baf1a6 100644
--- a/system/nxrecorder/nxrecorder.c
+++ b/system/nxrecorder/nxrecorder.c
@@ -108,14 +108,29 @@ static const struct nxrecorder_ext_fmt_s g_known_ext[] =
   { "midi",     AUDIO_FMT_MIDI, NULL },
 #endif
 #ifdef CONFIG_AUDIO_FORMAT_OGG_VORBIS
-  { "ogg",      AUDIO_FMT_OGG_VORBIS, NULL }
+  { "ogg",      AUDIO_FMT_OGG_VORBIS, NULL },
 #endif
+  { "amr",      AUDIO_FMT_AMR, NULL }
 };
 
 static const int g_known_ext_count = sizeof(g_known_ext) /
                     sizeof(struct nxrecorder_ext_fmt_s);
 #endif
 
+static const struct nxrecorder_enc_ops_s g_enc_ops[] =
+{
+  {
+    AUDIO_FMT_AMR,
+    nxrecorder_write_amr,
+    nxrecorder_write_common,
+  },
+  {
+    AUDIO_FMT_PCM,
+    NULL,
+    nxrecorder_write_common,
+  }
+};
+
 /****************************************************************************
  * Private Functions
  ****************************************************************************/
@@ -353,7 +368,7 @@ static int nxrecorder_writebuffer(FAR struct nxrecorder_s *precorder,
 
   /* Write data to the file. */
 
-  ret = write(precorder->fd, apb->samp, apb->nbytes);
+  ret = precorder->ops->write_data(precorder->fd, apb);
   if (ret < 0)
     {
       return ret;
@@ -1019,6 +1034,7 @@ int nxrecorder_recordinternal(FAR struct nxrecorder_s *precorder,
   int                      min_channels;
   int                      ret;
   int                      subfmt = AUDIO_FMT_UNDEF;
+  int                      index;
 
   DEBUGASSERT(precorder != NULL);
   DEBUGASSERT(pfilename != NULL);
@@ -1070,6 +1086,30 @@ int nxrecorder_recordinternal(FAR struct nxrecorder_s *precorder,
       goto err_out_nodev;
     }
 
+  for (index = 0; index < sizeof(g_enc_ops) / sizeof(g_enc_ops[0]); index++)
+    {
+      if (g_enc_ops[index].format == filefmt)
+        {
+          precorder->ops = &g_enc_ops[index];
+          break;
+        }
+    }
+
+  if (!precorder->ops)
+    {
+      goto err_out;
+    }
+
+  if (precorder->ops->pre_write)
+    {
+      ret = precorder->ops->pre_write(precorder->fd,
+                                      samprate, nchannels, bpsamp);
+      if (ret < 0)
+        {
+          goto err_out;
+        }
+    }
+
   /* Try to reserve the device */
 
 #ifdef CONFIG_AUDIO_MULTI_SESSION
diff --git a/system/nxrecorder/nxrecorder_amr.c b/system/nxrecorder/nxrecorder_amr.c
new file mode 100644
index 000000000..646be196f
--- /dev/null
+++ b/system/nxrecorder/nxrecorder_amr.c
@@ -0,0 +1,67 @@
+/****************************************************************************
+ * apps/system/nxrecorder/nxrecorder_amr.c
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.  The
+ * ASF licenses this file to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance with the
+ * License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.  See the
+ * License for the specific language governing permissions and limitations
+ * under the License.
+ *
+ ****************************************************************************/
+
+/****************************************************************************
+ * Included Files
+ ****************************************************************************/
+
+#include <sys/types.h>
+
+#include <stdio.h>
+#include <unistd.h>
+
+#include <nuttx/audio/audio.h>
+
+#include "system/nxrecorder.h"
+
+/****************************************************************************
+ * Private Type Declarations
+ ****************************************************************************/
+
+static const uint8_t AMR_NB[6] = "#!AMR\n";
+static const uint8_t AMR_WB[9] = "#!AMR-WB\n";
+
+/****************************************************************************
+ * Public Functions
+ ****************************************************************************/
+
+/****************************************************************************
+ * Name: nxrecorder_record_amr
+ *
+ *   nxrecorder_record_amr() add amr file header
+ *
+ ****************************************************************************/
+
+int nxrecorder_write_amr(int fd, uint32_t samplerate,
+                         uint8_t chans, uint8_t bps)
+{
+  const uint8_t *data;
+  int size;
+
+  if (samplerate != 8000 && samplerate != 16000)
+    {
+      return -EINVAL;
+    }
+
+  data = samplerate == 16000 ? &AMR_WB[0] : &AMR_NB[0];
+  size = samplerate == 16000 ? sizeof(AMR_WB) : sizeof(AMR_NB);
+
+  return write(fd, data, size);
+}
diff --git a/system/nxrecorder/nxrecorder_common.c b/system/nxrecorder/nxrecorder_common.c
new file mode 100644
index 000000000..04d3ce941
--- /dev/null
+++ b/system/nxrecorder/nxrecorder_common.c
@@ -0,0 +1,67 @@
+/****************************************************************************
+ * apps/system/nxrecorder/nxrecorder_common.c
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.  The
+ * ASF licenses this file to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance with the
+ * License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.  See the
+ * License for the specific language governing permissions and limitations
+ * under the License.
+ *
+ ****************************************************************************/
+
+/****************************************************************************
+ * Included Files
+ ****************************************************************************/
+
+#include <sys/types.h>
+
+#include <assert.h>
+#include <debug.h>
+#include <stdint.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <unistd.h>
+
+#include <nuttx/audio/audio.h>
+
+#include "system/nxrecorder.h"
+
+/****************************************************************************
+ * Public Functions
+ ****************************************************************************/
+
+/****************************************************************************
+ * Name: nxrecorder_write_common
+ *
+ *   Performs common function to write data to apb buffer
+ *
+ * Input Parameters:
+ *   fd     - recording file descriptor
+ *   apb    - ap buffer
+ *
+ * Returned Value:
+ *   OK if apb buffer write successfully.
+ *
+ ****************************************************************************/
+
+int nxrecorder_write_common(int fd, FAR struct ap_buffer_s *apb)
+{
+  int ret = 0;
+
+  ret = write(fd, apb->samp, apb->nbytes);
+  if (ret < 0)
+    {
+      auderr("ERROR: precorder write failed: %d\n", ret);
+    }
+
+  return ret;
+}