編輯:關於Android編程
對於pcm設備的操作只需要注意所操作的設備是否存在,以及設備的能力問題不要設置設備所不能及的能力設備就可以正常工作了,其實就是需要注意channels、rate、format、period_size和period_count。/* 對pcm設備節點的操作 */
struct pcm *pcm_open(unsigned int card, unsigned int device, unsigned int flags, struct pcm_config *config);
int pcm_close(struct pcm *pcm);
int pcm_is_ready(struct pcm *pcm);
/* 獲取pcm設備的能力 */
struct pcm_params *pcm_params_get(unsigned int card, unsigned int device, unsigned int flags);
void pcm_params_free(struct pcm_params *pcm_params);
unsigned int pcm_params_get_min(struct pcm_params *pcm_params, enum pcm_param param);
unsigned int pcm_params_get_max(struct pcm_params *pcm_params, enum pcm_param param);
/* 配置pcm設備capture和playback的規格 */
int pcm_get_config(struct pcm *pcm, struct pcm_config *config);
int pcm_set_config(struct pcm *pcm, struct pcm_config *config);
/* 返回調用tinyalsa最後的錯誤信息 */
const char *pcm_get_error(struct pcm *pcm);
/* 設置pcm設備采集和播放的位數,位數越高越接近真實聲音 */
unsigned int pcm_format_to_bits(enum pcm_format format);
/* pcm設備的內置緩沖之間大小、幀數、時間的轉換 */
unsigned int pcm_get_buffer_size(struct pcm *pcm);
unsigned int pcm_frames_to_bytes(struct pcm *pcm, unsigned int frames);
unsigned int pcm_bytes_to_frames(struct pcm *pcm, unsigned int bytes);
unsigned int pcm_get_latency(struct pcm *pcm); // in ms
/* 返回下一幀的有效幀指針和該幀時間戳,時間戳有CLOCK_MONOTONIC和CLOCK_REALTIME可選,裡面使用的是CLOCK_REALTIME */
/* 我認為應該需要兩個時間戳,一個用於播放的時間戳(CLOCK_MONOTONIC)不受系統時間的影響,一個用於記錄當前音頻采集的時間戳(CLOCK_REALTIME) */
int pcm_get_htimestamp(struct pcm *pcm, unsigned int *avail, struct timespec *tstamp);
/* 通過FIFO把數據寫入硬件用於playback或者從硬件中讀取capture數據 */
int pcm_write(struct pcm *pcm, const void *data, unsigned int count);
int pcm_read(struct pcm *pcm, void *data, unsigned int count);
/* 這是一個可選的和hardware通信的方式。 */
int pcm_mmap_write(struct pcm *pcm, const void *data, unsigned int count);
int pcm_mmap_read(struct pcm *pcm, void *data, unsigned int count);
int pcm_mmap_begin(struct pcm *pcm, void **areas, unsigned int *offset, unsigned int *frames);
int pcm_mmap_commit(struct pcm *pcm, unsigned int offset, unsigned int frames);
int pcm_start(struct pcm *pcm);
int pcm_stop(struct pcm *pcm);
int pcm_wait(struct pcm *pcm, int timeout);
int pcm_set_avail_min(struct pcm *pcm, int avail_min);
/* 對mixer設備的操作 */
struct mixer *mixer_open(unsigned int card);
void mixer_close(struct mixer *mixer);
/* 獲取mixer設備信息name */
const char *mixer_get_name(struct mixer *mixer);
/* 獲取mixer設備的控制句柄 struct mixer_ctl */
unsigned int mixer_get_num_ctls(struct mixer *mixer);
struct mixer_ctl *mixer_get_ctl(struct mixer *mixer, unsigned int id);
struct mixer_ctl *mixer_get_ctl_by_name(struct mixer *mixer, const char *name);
/* 取mixer設備的控制信息 */
const char *mixer_ctl_get_name(struct mixer_ctl *ctl);
enum mixer_ctl_type mixer_ctl_get_type(struct mixer_ctl *ctl);
const char *mixer_ctl_get_type_string(struct mixer_ctl *ctl);
unsigned int mixer_ctl_get_num_values(struct mixer_ctl *ctl);
unsigned int mixer_ctl_get_num_enums(struct mixer_ctl *ctl);
const char *mixer_ctl_get_enum_string(struct mixer_ctl *ctl, unsigned int enum_id);
/* Some sound cards update their controls due to external events,
* such as HDMI EDID byte data changing when an HDMI cable is
* connected. This API allows the count of elements to be updated.
*/
void mixer_ctl_update(struct mixer_ctl *ctl);
/* 設置和獲取可控制的信息,方式有比例、數組、范圍、固定值 */
/* id通過mixer_get_num_ctls獲得 */
int mixer_ctl_get_percent(struct mixer_ctl *ctl, unsigned int id);
int mixer_ctl_set_percent(struct mixer_ctl *ctl, unsigned int id, int percent);
int mixer_ctl_get_value(struct mixer_ctl *ctl, unsigned int id);
int mixer_ctl_get_array(struct mixer_ctl *ctl, void *array, size_t count);
int mixer_ctl_set_value(struct mixer_ctl *ctl, unsigned int id, int value);
int mixer_ctl_set_array(struct mixer_ctl *ctl, const void *array, size_t count);
int mixer_ctl_set_enum_by_string(struct mixer_ctl *ctl, const char *string);
int mixer_ctl_get_range_min(struct mixer_ctl *ctl);
int mixer_ctl_get_range_max(struct mixer_ctl *ctl);
之前一篇文章研究完橫向二級菜單,發現其中使用了SparseArray去替換HashMap的使用.於是乎自己查了一些相關資料,自己同時對性能進行了一些測試。首先先說一下Sp
1、Activity的工作原理在我們的應用程序中,當存在多個Activity切換時,他們如何切換的。在上一個文章中,我們知道了Activity生命周期的幾個函數,當Act
一起來看看微信電腦版視頻通話圖文教程吧 1、首先,我們需要更新微信電腦版到1.5版 2、微信視頻聊天的方法也有兩種哦,第一種方法是登錄手機微信選擇視頻的
1.申請微信APPID要實現分享到微信的功能,首先要到微信開放平台申請一個APPID。但在申請APPID的時候需要填寫一個應用簽名和應用包名。需要注意的是包名