sbcenc.c
-
main(int argc, char *argv[])
首先设定 option 的默认值,然后根据用户命令设定 option 相关参数。
对指定文件进行编码(执行encode函数)
-
usage(void)
打印相关option:
Option Option 打印帮助信息 h help 打印帮助信息 v verbose 详细模式 m msbc mSBC编解码器 s subbands 子带数量(4/8) b bitpool Bitpool value j joint 联合立体声 d dualchannel 双声道 S snr 信噪比模式(default/loudness) B blocks block数量(4/8/12/16) -
encode(char *filename, int subbands, int bitpool, int joint, int dualchannel, int snr, int blocks, bool msbc)
定义一个
au_header
类型的变量au_hdr
// formats.h struct au_header { uint32_t magic; /* '.snd' */ uint32_t hdr_size; /* size of header (min 24) */ uint32_t data_size; /* size of data */ uint32_t encoding; /* see to AU_FMT_XXXX */ uint32_t sample_rate; /* sample rate */ uint32_t channels; /* number of channels (voices) */ };
定义一个
sbc_t
类型的变量sbc
// sbc.h struct sbc_struct { unsigned long flags; uint8_t frequency; uint8_t blocks; uint8_t subbands; uint8_t mode; uint8_t allocation; uint8_t bitpool; uint8_t endian; void *priv; void *priv_alloc_base; }; typedef struct sbc_struct sbc_t;
定义
ssize_t
类型的变量encoded
和len
,实际是ssize_t
就是long
类型。// _types.h typedef long __darwin_ssize_t; /* byte count or error */ // _ssize_t.h typedef __darwin_ssize_t ssize_t;
检测
au_hdr
的长度是否是24。if (sizeof(au_hdr) != 24) { /* Sanity check just in case */ fprintf(stderr, "FIXME: sizeof(au_hdr) != 24\n"); return; }
确定指定文件合法性并打开文件。
if (strcmp(filename, "-")) { fd = open(filename, O_RDONLY); if (fd < 0) { fprintf(stderr, "Can't open file %s: %s\n", filename, strerror(errno)); return; } } else fd = fileno(stdin);
将文件中头部数据读入
au_hdr
,并确定是否读取成功。len = read(fd, &au_hdr, sizeof(au_hdr)); if (len < (ssize_t) sizeof(au_hdr)) { if (fd > fileno(stderr)) fprintf(stderr, "Can't read header from file %s: %s\n", filename, strerror(errno)); else perror("Can't read audio header"); goto done; }
确定文件的格式是否符合
Sun/NeXT audio S16_BE
格式。if (au_hdr.magic != AU_MAGIC || BE_INT(au_hdr.hdr_size) > 128 || BE_INT(au_hdr.hdr_size) < sizeof(au_hdr) || BE_INT(au_hdr.encoding) != AU_FMT_LIN16) { fprintf(stderr, "Not in Sun/NeXT audio S16_BE format\n"); goto done; }
判断使用sbc编码还是msbc编码。
sbc
- 初始化
sbc
。
// sbc.c // sbc_init() SBC_EXPORT int sbc_init(sbc_t *sbc, unsigned long flags) { if (!sbc) return -EIO; memset(sbc, 0, sizeof(sbc_t)); sbc->priv_alloc_base = malloc(sizeof(struct sbc_priv) + SBC_ALIGN_MASK)
- 初始化