# HG changeset patch # User Mike Miller # Date 1422841597 18000 # Node ID 793d295fed4d771433c9c50c44d73e5f8e14fa4c # Parent b3363c531662b669569e798dcbec95cdd1da3bf9 Fix sndfile bit width handling in audio functions * audioread.cc (Faudioread, Faudioinfo): Fix decoding of audio format bit width from sndfile format field. (Faudiowrite): Mask format field properly when setting audio output bit width. Use unsigned format for 8-bit WAV output. diff -r b3363c531662 -r 793d295fed4d libinterp/dldfcn/audioread.cc --- a/libinterp/dldfcn/audioread.cc Sat Feb 07 19:38:44 2015 -0500 +++ b/libinterp/dldfcn/audioread.cc Sun Feb 01 20:46:37 2015 -0500 @@ -166,18 +166,27 @@ if (type == "native") { - if (info.format & SF_FORMAT_PCM_S8) - ret_audio = int8NDArray (audio * 127); - else if (info.format & SF_FORMAT_PCM_U8) - ret_audio = uint8NDArray (audio * 127 + 127); - else if (info.format & SF_FORMAT_PCM_16) - ret_audio = int16NDArray (audio * 32767); - else if (info.format & SF_FORMAT_PCM_24) - ret_audio = int32NDArray (audio * 8388608); - else if (info.format & SF_FORMAT_PCM_32) - ret_audio = int32NDArray (audio * 2147483648); - else - ret_audio = audio; + switch (info.format & SF_FORMAT_SUBMASK) + { + case SF_FORMAT_PCM_S8: + ret_audio = int8NDArray (audio * 127); + break; + case SF_FORMAT_PCM_U8: + ret_audio = uint8NDArray (audio * 127 + 127); + break; + case SF_FORMAT_PCM_16: + ret_audio = int16NDArray (audio * 32767); + break; + case SF_FORMAT_PCM_24: + ret_audio = int32NDArray (audio * 8388608); + break; + case SF_FORMAT_PCM_32: + ret_audio = int32NDArray (audio * 2147483648); + break; + default: + ret_audio = audio; + break; + } } else ret_audio = audio; @@ -355,9 +364,15 @@ { if (args(i).string_value () == "BitsPerSample") { + info.format &= ~SF_FORMAT_SUBMASK; int bits = args(i + 1).int_value (); if (bits == 8) - info.format |= SF_FORMAT_PCM_S8; + { + if ((info.format & SF_FORMAT_TYPEMASK) == SF_FORMAT_WAV) + info.format |= SF_FORMAT_PCM_U8; + else + info.format |= SF_FORMAT_PCM_S8; + } else if (bits == 16) info.format |= SF_FORMAT_PCM_16; else if (bits == 24) @@ -491,18 +506,27 @@ result.assign ("Duration", dframes / drate); int bits; - if (info.format & SF_FORMAT_PCM_S8) - bits = 8; - else if (info.format & SF_FORMAT_PCM_U8) - bits = 8; - else if (info.format & SF_FORMAT_PCM_16) - bits = 16; - else if (info.format & SF_FORMAT_PCM_24) - bits = 24; - else if (info.format & SF_FORMAT_PCM_32) - bits = 32; - else - bits = -1; + switch (info.format & SF_FORMAT_SUBMASK) + { + case SF_FORMAT_PCM_S8: + bits = 8; + break; + case SF_FORMAT_PCM_U8: + bits = 8; + break; + case SF_FORMAT_PCM_16: + bits = 16; + break; + case SF_FORMAT_PCM_24: + bits = 24; + break; + case SF_FORMAT_PCM_32: + bits = 32; + break; + default: + bits = -1; + break; + } result.assign ("BitsPerSample", bits); result.assign ("BitRate", -1);