2012-04-07 8 views
0

Javaを使用してMacのマイクからオーディオを録音しようとしています。私はGoogleで検索のビットの後一番下にあるコードを見つけましたが、すべての3または4回のうち1は、私は、Eclipse、エラーでそれを実行すると:Macでオーディオをキャプチャする際に、ポインタが解放されていませんでしたか?

java(4946,0x1095f9000) malloc: *** error for object 0xd07400083: pointer being freed was not allocated 
*** set a breakpoint in malloc_error_break to debug 

がコンソールに表示されます。ここの別の記事によると、OSX用にAppleから提供された不正なライブラリと関係があるが、私はJavaでオーディオをキャプチャする方法は知らない。使用しているJavaコードを変更してこのエラーを防ぐ方法はありますか、それともコードの範囲外です。

これは私が使用していたコードです:

import java.io.File; 
import java.io.IOException; 
import javax.sound.sampled.AudioFileFormat; 
import javax.sound.sampled.AudioFormat; 
import javax.sound.sampled.AudioInputStream; 
import javax.sound.sampled.AudioSystem; 
import javax.sound.sampled.DataLine; 
import javax.sound.sampled.LineUnavailableException; 
import javax.sound.sampled.TargetDataLine; 


public class AudioCapture extends Thread 
{ 
private TargetDataLine dataLine; 
private AudioFileFormat.Type audioFileType; 
private AudioInputStream incomingStream; 
private File generatedFile; 

public AudioCapture(TargetDataLine line, 
     AudioFileFormat.Type requiredFileType, 
     File file){ 
    dataLine = line; 
    incomingStream = new AudioInputStream(line); 
    audioFileType = requiredFileType; 
    generatedFile = file;} 

public void startCapture(){ 
    dataLine.start(); 
    super.start();} 

public void stopCapture(){ 
    dataLine.stop(); 
    dataLine.close();} 

public void run(){ 
    try{ 
     AudioSystem.write(
       incomingStream, 
       audioFileType, 
       generatedFile);} 
    catch (IOException e){ 
     e.printStackTrace();} 
} 

public static void main(String[] args){ 
    String strFilename = "captureFile.wav"; 
    File outputFile = new File(strFilename); 

    AudioFormat audioFormat = new AudioFormat(
      AudioFormat.Encoding.PCM_SIGNED, 
      22050.0F, 16, 2, 
      4, 22050.0F, false); 
    DataLine.Info info = new DataLine.Info(TargetDataLine.class, 
      audioFormat); 
    TargetDataLine targetDataLine = null; 
    try{ 
     targetDataLine = (TargetDataLine) AudioSystem.getLine(info); 
     targetDataLine.open(audioFormat);} 
    catch (LineUnavailableException e){ 
     System.out.println("Unable to acquire an audio recording line"); 
     e.printStackTrace(); 
     System.exit(1);} 
    System.out.println("AudioFormat settings: " + audioFormat.toString()); 
    AudioFileFormat.Type targetType = AudioFileFormat.Type.WAVE; 
    AudioCapture recorder = new AudioCapture(
      targetDataLine, 
      targetType, 
      outputFile); 

    recorder.startCapture(); 
    System.out.println("Starting the recording now..."); 
    System.out.println("Please press to stop the recording."); 
    try{ 
     System.in.read();} 
    catch (IOException e){ 
     e.printStackTrace();} 

    recorder.stopCapture(); 
    System.out.println("Capture stopped.");} 
} 
+0

あなたが遭遇した問題は、あなたが使用しているパッケージによって設定されたプロトコルに従わないことと関係していると思われます。 「ハンドル」を返したり、内部的に「ハンドル」を保存したり、後で対応する呼び出しを実行して、それらのハンドルに属する内部オブジェクトを解放したりすることが期待されています。おそらく、ハンドルが「長い」場合は 'int'や' double'に変換せず、算術演算をしないでください)、またはあなたが行ったよりも多くの「解放」タイプの呼び出しを実行したかのいずれかです「割当て」コール。 –

+0

私は不思議です - あなたはOSXのための "不正なライブラリ"についてのリンクを投稿することができますか? –

+0

他の誰かが同じ問題(http://stackoverflow.com/questions/9333311/non-aligned-pointer-being-freed-in-java)を経験しており、OSXのCoreMIDIライブラリまで追跡しましたが、私はJava SoundのMIDI機能を使用していないため、エラーを引き起こすライブラリではないと思います。 – user1319675

答えて

0

これは、アクションのやや野心的なコースですが、:

あなたはそれが(これは私を助けるまさにそれが言うとデバッグができますか?私は確信していません)。 CDTパッケージをインストールすると、gdbでコンパイルをデバッグできます。

  • プロジェクト(Project > Run/Debug Settingsを構築し、新たなC++プロジェクトを作成し、プロジェクトwith arguments to match theseをコンパイルするjavacを呼び出して、新しい起動設定を作成
  • 編集:。。debug it with the gdb console
  • を参照してください、それがどの明確化何かを言えば
関連する問題