2011-08-23 60 views
2

我已简单地程序来交换在PCM音频端(2个通道,48kHz的,24位),但只有一个信道被正确地交换,第二个仍然是小端(我检查生成输出在CoolEdit 2000中)。任何人都可以给我一些指导,我的代码中有什么问题?交换端

inline int endian_swap(unsigned int x) 
{ 
unsigned char c1, c2, c3, c4; 

    c1 = x & 255; 
    c2 = (x >> 8) & 255; 
    c3 = (x >> 16) & 255; 
    c4 = (x >> 24) & 255; 

    return ((int)c1 << 24) + ((int)c2 << 16) + ((int)c3 << 8) + c4; 
} 

int main() 
{ 

FILE *fpIn, *fpOut; 
short x; 

fpIn = fopen("audio.pcm", "rb"); 
fpOut = fopen("out.pcm", "wb"); 
int test = sizeof(short); 

int count = 0; 
int swaped = 0; 

while(fread(&x, sizeof(int), 1, fpIn) == 1) 
    { 
    swaped = endian_swap(x); 

    fwrite(&swaped, sizeof(int), 1, fpOut); 
    } 

system("pause"); 
return 0; 
} 

此致敬礼!

+0

'endian_swap()'如何实现? – sharptooth

+0

对不起,我没有在 – Luke

+1

之前添加endian_swap()通过组合这两个错误(由Oli Charlesworth和mtrw提到),我很惊讶任何一个频道看起来都不错。 –

回答

2

您正在阅读的文件一个int在时间英寸但是int可能是16位或32位。你说你有24位音频。

您应该修改代码,以便每次读取三个char,并将其读入char [3]阵列。然后,您将修改swap_endian函数以在char [3]上操作(这很简单;只需交换阵列的第一个元素和最后一个元素的内容!)

+0

不要忘记,如果将这些值传递给交换32位整数的函数,交换24位值的字节顺序将不起作用。 –

1

您声明short x。尝试声明unsigned int x

+0

这确实是一个问题。但它不会解决主要问题(请参阅我的答案)。 –

+0

@Oli - 我认为这个文件实际上包含'int's,而不是'char [3]',因为我从来没有这样做过。大多数接口最终会得到完整的32位结果,其中24位数据位移到一端或另一端。我想这就是为什么一个频道在OP的第一个实验中看起来不错。如果该文件真的保留了'char [3]',那么这两个通道看起来都会变形。 – mtrw

+0

@mrtw:我不是说这个文件实际上包含'char [3]',它将包含'int24's,但它们不作为C中的本地类型存在! –