I can't be certain without compiling your code, but it looks like your interleaving algorithm is writing two samples to the same index in your output buffer rather than writing one sample to the output buffer twice.
This code:
strm_out[frames_iter] = (strm -> data_pos++)[0];
strm_out[frames_iter] = (strm -> data_pos++)[1];
Should look something like:
M_float* sample = (strm -> data_pos++)[0];
strm_out[frames_iter] = sample;
strm_out[++frames_iter] = sample;
Again this may not be exactly right, but hopefully it illustrates my point.