static __inline int decode_insn(struct ud *u, uint16_t ptr) { assert((ptr & 0x8000) == 0); u->itab_entry = &ud_itab[ ptr ]; u->mnemonic = u->itab_entry->mnemonic; return (resolve_mode(u) == 0 && decode_operands(u) == 0 && resolve_mnemonic(u) == 0) ? 0 : -1; }
static int decode_update(struct audec_state **adsp, const struct aucodec *ac, const char *fmtp) { struct audec_state *st; int err = 0; (void)fmtp; if (!adsp || !ac) return EINVAL; if (*adsp) return 0; st = mem_zalloc(sizeof(*st), decode_destructor); if (!st) return ENOMEM; st->frame_size = ac->srate * SPEEX_PTIME / 1000; st->channels = ac->ch; /* Decoder */ st->dec = speex_decoder_init(resolve_mode(ac->srate)); if (!st->dec) { err = ENOMEM; goto out; } speex_bits_init(&st->bits); if (2 == st->channels) { /* Stereo. */ st->stereo.balance = 1; st->stereo.e_ratio = .5f; st->stereo.smooth_left = 1; st->stereo.smooth_right = 1; st->callback.callback_id = SPEEX_INBAND_STEREO; st->callback.func = speex_std_stereo_request_handler; st->callback.data = &st->stereo; speex_decoder_ctl(st->dec, SPEEX_SET_HANDLER, &st->callback); } decoder_config(st->dec); out: if (err) mem_deref(st); else *adsp = st; return err; }
static int encode_update(struct auenc_state **aesp, const struct aucodec *ac, struct auenc_param *prm, const char *fmtp) { struct auenc_state *st; int ret, err = 0; if (!aesp || !ac || !prm) return EINVAL; if (prm->ptime != SPEEX_PTIME) return EPROTO; if (*aesp) return 0; st = mem_zalloc(sizeof(*st), encode_destructor); if (!st) return ENOMEM; st->frame_size = ac->srate * SPEEX_PTIME / 1000; st->channels = ac->ch; /* Encoder */ st->enc = speex_encoder_init(resolve_mode(ac->srate)); if (!st->enc) { err = ENOMEM; goto out; } speex_bits_init(&st->bits); encoder_config(st->enc); ret = speex_encoder_ctl(st->enc, SPEEX_GET_FRAME_SIZE, &st->frame_size); if (ret) { warning("speex: SPEEX_GET_FRAME_SIZE: %d\n", ret); } if (str_isset(fmtp)) { struct pl params; pl_set_str(¶ms, fmtp); fmt_param_apply(¶ms, param_handler, st); } out: if (err) mem_deref(st); else *aesp = st; return err; }