518b1aea61
Signed-off-by: jinxiuxu <jinxiuxu@xiaomi.com>
283 lines
9.8 KiB
C
283 lines
9.8 KiB
C
/****************************************************************************
|
|
* apps/include/system/nxrecorder.h
|
|
*
|
|
* 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.
|
|
*
|
|
****************************************************************************/
|
|
|
|
#ifndef __APPS_INCLUDE_SYSTEM_NXRECORDER_H
|
|
#define __APPS_INCLUDE_SYSTEM_NXRECORDER_H
|
|
|
|
/****************************************************************************
|
|
* Included Files
|
|
****************************************************************************/
|
|
|
|
#include <nuttx/config.h>
|
|
|
|
#include <mqueue.h>
|
|
#include <pthread.h>
|
|
|
|
/****************************************************************************
|
|
* Pre-processor Definitions
|
|
****************************************************************************/
|
|
|
|
/****************************************************************************
|
|
* 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
|
|
{
|
|
int state; /* Current recorder state */
|
|
int dev_fd; /* File descriptor of active device */
|
|
mqd_t mq; /* Message queue for the recordthread */
|
|
char mqname[32]; /* Name of our message queue */
|
|
pthread_t record_id; /* Thread ID of the recordthread */
|
|
int crefs; /* Number of references to the recorder */
|
|
pthread_mutex_t mutex; /* Thread sync mutex */
|
|
int fd; /* File descriptor of open file */
|
|
char device[CONFIG_NAME_MAX]; /* Preferred audio device */
|
|
#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,
|
|
char *pargs);
|
|
|
|
/****************************************************************************
|
|
* Public Data
|
|
****************************************************************************/
|
|
|
|
#ifdef __cplusplus
|
|
#define EXTERN extern "C"
|
|
extern "C"
|
|
{
|
|
#else
|
|
#define EXTERN extern
|
|
#endif
|
|
|
|
/****************************************************************************
|
|
* Public Function Prototypes
|
|
****************************************************************************/
|
|
|
|
/****************************************************************************
|
|
* Name: nxrecorder_create
|
|
*
|
|
* Allocates and Initializes a NxRecorder context that is passed to all
|
|
* nxrecorder routines. The recorder MUST be destroyed using the
|
|
* nxrecorder_destroy() routine since the context is reference counted.
|
|
* The context can be used in a mode where the caller creates the
|
|
* context, starts a file recording, and then forgets about the context
|
|
* and it will self free. This is because the nxrecorder_recordfile
|
|
* will also create a reference to the context, so the client calling
|
|
* nxrecorder_destroy() won't actually de-allocate anything. The freeing
|
|
* will occur after the record thread has completed.
|
|
*
|
|
* Alternately, the caller can create the object and hold on to it, then
|
|
* the context will persist until the original creator destroys it.
|
|
*
|
|
* Input Parameters: None
|
|
*
|
|
* Returned Value:
|
|
* Pointer to created NxRecorder context or NULL if error.
|
|
*
|
|
****************************************************************************/
|
|
|
|
FAR struct nxrecorder_s *nxrecorder_create(void);
|
|
|
|
/****************************************************************************
|
|
* Name: nxrecorder_release
|
|
*
|
|
* Reduces the reference count to the recorder and if it reaches zero,
|
|
* frees all memory used by the context.
|
|
*
|
|
* Input Parameters:
|
|
* precorder Pointer to the NxRecorder context
|
|
*
|
|
* Returned Value:
|
|
* None
|
|
*
|
|
****************************************************************************/
|
|
|
|
void nxrecorder_release(FAR struct nxrecorder_s *precorder);
|
|
|
|
/****************************************************************************
|
|
* Name: nxrecorder_reference
|
|
*
|
|
* Increments the reference count to the recorder.
|
|
*
|
|
* Input Parameters:
|
|
* precorder Pointer to the NxRecorder context
|
|
*
|
|
* Returned Value:
|
|
* None
|
|
*
|
|
****************************************************************************/
|
|
|
|
void nxrecorder_reference(FAR struct nxrecorder_s *precorder);
|
|
|
|
/****************************************************************************
|
|
* Name: nxrecorder_setdevice
|
|
*
|
|
* Sets the preferred Audio device to use with the instance of the
|
|
* nxrecorder. Without a preferred device set, the nxrecorder will search
|
|
* the audio subsystem to find a suitable device depending on the
|
|
* type of audio operation requested (i.e. an MP3 decoder device when
|
|
* recording an MP3 file, a WAV decoder device for a WAV file, etc.).
|
|
*
|
|
* Input Parameters:
|
|
* precorder - Pointer to the context to initialize
|
|
* device - Pointer to pathname of the preferred device
|
|
*
|
|
* Returned Value:
|
|
* OK if context initialized successfully, error code otherwise.
|
|
*
|
|
****************************************************************************/
|
|
|
|
int nxrecorder_setdevice(FAR struct nxrecorder_s *precorder,
|
|
FAR const char *device);
|
|
|
|
/****************************************************************************
|
|
* Name: nxrecorder_recordinternal
|
|
*
|
|
* Plays the specified media file (from the filesystem) using the
|
|
* Audio system. If a preferred device has been set, that device
|
|
* will be used for the recordback, otherwise the first suitable device
|
|
* found in the /dev/audio directory will be used.
|
|
*
|
|
* Input Parameters:
|
|
* precorder - Pointer to the context to initialize
|
|
* filename - Pointer to pathname of the file to record
|
|
* nchannels - channels num
|
|
* bpsampe - bit width
|
|
* samprate - sample rate
|
|
* chmap channel map
|
|
*
|
|
* Returned Value:
|
|
* OK if file found, device found, and recordback started.
|
|
*
|
|
****************************************************************************/
|
|
|
|
int nxrecorder_recordinternal(FAR struct nxrecorder_s *precorder,
|
|
FAR const char *filename, int filefmt,
|
|
uint8_t nchannels, uint8_t bpsamp,
|
|
uint32_t samprate, uint8_t chmap);
|
|
|
|
/****************************************************************************
|
|
* Name: nxrecorder_stop
|
|
*
|
|
* Stops current recordback.
|
|
*
|
|
* Input Parameters:
|
|
* precorder - Pointer to the context to initialize
|
|
*
|
|
* Returned Value:
|
|
* OK if file found, device found, and recordback started.
|
|
*
|
|
****************************************************************************/
|
|
|
|
#ifndef CONFIG_AUDIO_EXCLUDE_STOP
|
|
int nxrecorder_stop(FAR struct nxrecorder_s *precorder);
|
|
#endif
|
|
|
|
/****************************************************************************
|
|
* Name: nxrecorder_pause
|
|
*
|
|
* Pauses current recordback.
|
|
*
|
|
* Input Parameters:
|
|
* precorder - Pointer to the context to initialize
|
|
*
|
|
* Returned Value:
|
|
* OK if file found, device found, and recordback started.
|
|
*
|
|
****************************************************************************/
|
|
|
|
#ifndef CONFIG_AUDIO_EXCLUDE_PAUSE_RESUME
|
|
int nxrecorder_pause(FAR struct nxrecorder_s *precorder);
|
|
#endif
|
|
|
|
/****************************************************************************
|
|
* Name: nxrecorder_resume
|
|
*
|
|
* Resumes current recordback.
|
|
*
|
|
* Input Parameters:
|
|
* precorder - Pointer to the context to initialize
|
|
*
|
|
* Returned Value:
|
|
* OK if file found, device found, and recordback started.
|
|
*
|
|
****************************************************************************/
|
|
|
|
#ifndef CONFIG_AUDIO_EXCLUDE_PAUSE_RESUME
|
|
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
|
|
}
|
|
#endif
|
|
|
|
#endif /* __APPS_INCLUDE_SYSTEM_NXRECORDER_H */
|