2011-08-23 21 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中的本地類型存在! –

相關問題