1. math.h compilation error: expected declaration specifiers or '…' before '('
解決方法參考: http://stackoverflow.com/questions/9503473/math-h-compilation-error-expected-declaration-specifiers-or-before
找到 math.h,然後放到 roundf 函式的宣告的前面(這是只有 GCC 才有的問題) ,所以要做的就是修正 ./jkFormatMP3.c,
#include
#include
#include "snack.h"
#include "jkFormatMP3.h"
2. 因為要在 Linux 上使用 ALSA,所以要這樣下(在 x86_64 版本上):
./configure --enable-alsa --enable-shared --with-tcl=/usr/lib64 --with-tk=/usr/lib64
如果是 x86 的版本:
./configure --enable-alsa --enable-shared --with-tcl=/usr/lib --with-tk=/usr/lib
但是因為 _snd_pcm_mmap_hw_ptr 已經是過時的 function,所以要使用 snack-alsa.patch 裡面的內容來修正,下面是修正的地方:
Index: unix/jkAudIO_alsa.c
===================================================================
--- unix/jkAudIO_alsa.c.orig
+++ unix/jkAudIO_alsa.c
@@ -49,6 +49,8 @@ static int littleEndian = 0;
static int minNumChan = 1;
+static snd_pcm_uframes_t hw_bufsize = 0;
+
int
SnackAudioOpen(ADesc *A, Tcl_Interp *interp, char *device, int mode, int freq,
int nchannels, int encoding)
@@ -135,6 +137,9 @@ SnackAudioOpen(ADesc *A, Tcl_Interp *int
Tcl_AppendResult(interp, "Failed setting HW params.", NULL);
return TCL_ERROR;
}
+
+ snd_pcm_hw_params_get_buffer_size (hw_params, &hw_bufsize);
+
snd_pcm_hw_params_free(hw_params);
snd_pcm_prepare(A->handle);
if (A->mode == RECORD) {
@@ -202,6 +207,8 @@ SnackAudioPost(ADesc *A)
int i;
static char buf[64];
+ return;
+
if (A->debug > 1) Snack_WriteLog(" Enter SnackAudioPost\n");
for (i = 0; i < 1000; i++) {
@@ -267,12 +274,14 @@ SnackAudioWriteable(ADesc *A)
long
SnackAudioPlayed(ADesc *A)
{
- long avail = _snd_pcm_mmap_hw_ptr(A->handle);
+ // FIX Here, _snd_pcm_mmap_hw_ptr is deprecated in new alsalib
+ long played = A->nWritten - (hw_bufsize - SnackAudioWriteable(A));
+ // long avail = _snd_pcm_mmap_hw_ptr(A->handle);
- if (avail < 0)
- avail = 0;
+ if (played < 0)
+ return 0;
- return (avail+A->nPlayed);
+ return (played);
}
在修正過後,就可以編譯出來正確的 Tcl-Snack (Linux-ALSA) 版本。
剛剛快速測試以後,確定可以撥放 wav 檔,所以是可以正確使用的。
更新:
在將 tclsh 放置在 /usr/bin 以後,即使 snack 在 configure 時設定 prefix ,make install 以後仍然會放置在 /lib64/,需要自己手動放置到 /usr/lib64 (不知道怎麼解決)
沒有留言:
張貼留言