2012-07-18 22 views
48

Tôi đã viết một ứng dụng Java nhỏ cho mục đích thử nghiệm ghi lại âm thanh từ bộ trộn trên ubuntu 12.04.Ghi lại âm thanh từ Wine với TargetDataLine

Mã hoạt động tốt, tôi có thể ghi lại âm thanh từ tất cả các ứng dụng ngoại trừ mọi thứ đang chạy trong Wine.

Bất cứ khi nào tôi bắt đầu chương trình của tôi, sau khi rượu bắt đầu, các cuộc gọi đến targetDataLine.read() sẽ chặn vĩnh viễn

Khi Rượu không chạy ở chế độ nền, nó sẽ tạo ra một cách chính xác 0 khi không có đầu vào, hoặc số byte đọc nếu có đầu vào, như mong đợi.

Nếu tôi bắt đầu chương trình của mình trước khi bắt đầu Wine, trình điều khiển âm thanh sẽ không có sẵn trong rượu vang.

Tôi đã thử sử dụng cả bộ trộn do Alsa cung cấp cũng như thiết bị mặc định, cùng một kết quả.

Tôi có thể tưởng tượng rằng rượu bằng cách nào đó khóa Alsa (vì bất kỳ lý do gì), nhưng tại sao một cuộc gọi đơn giản tới TargetDataLine.read() khiến âm thanh không thành công trong Rượu? mixerInfo[0] là mặc định trên hệ thống btw của tôi và ứng dụng tất nhiên luôn chạy bên ngoài Wine bằng JRE mới nhất của oracle (7).

private void readSound() 
{ 
    byte tempBuffer[] = new byte[10000]; 
    int cnt = 0; 
    Mixer.Info[] mixerInfo = AudioSystem.getMixerInfo(); 

    System.out.println("Available mixers:"); 
    for (int p = 0; p < mixerInfo.length; p++) 
     System.out.println(mixerInfo[p].getName()); 

    format = getAudioFormat(); 
    DataLine.Info dataLineInfo = new DataLine.Info(TargetDataLine.class, format); 
    Mixer mixer = AudioSystem.getMixer(mixerInfo[0]); 

    try 
    { 
     targetDataLine = (TargetDataLine) mixer.getLine(dataLineInfo); 
     targetDataLine.open(format); 
    } 
    catch(Exception e) 
    { 
     e.printStackTrace(); 
    } 
    targetDataLine.start(); 

    while (true) 
    { 
     i++; 
     cnt = targetDataLine.read(tempBuffer, 0, tempBuffer.length); 
     System.out.println("read " + cnt + " bytes:" + tempBuffer[i]);    
     calculateLevel(tempBuffer, 0, 200); 
     targetDataLine.flush(); 
     System.out.println(level); 
    } 
} 
+2

Bạn có thể vui lòng cung cấp, trong bài đăng, đầu ra của chương trình trong cả hai trường hợp, khi Wine đang chạy và khi Wine không chạy. –

+0

Tôi nghĩ rằng việc sử dụng DataLine :: có thể giúp ngăn chặn. – IceGlow

+2

Kiểm tra cấu hình của Wine để xem cách thức truy cập âm thanh. http://askubuntu.com/questions/77210/how-to-change-the-default-audio-in-wine-to-alsa-only – IceGlow

Trả lời

1

Sử dụng phương thức AudioSystem.write(). Nó dễ dàng hơn nhiều

targetDataLine.open(format); 
targetDataLine.start(); 
AudioInputStream ais=new AudioInputStream(targetDataLine); 
AudioFileFormat.Type fileformat=AudioFileFormat.Type.WAVE; 
/* 
Other Audio file formats supported: 
AudioFileFormat.Type.AU 
AudioFileFormat.Type.AIFF 
AudioFileFormat.Type.AIFC 
AudioFileFormat.Type.SND 
*/ 
File audoutputfile=new File('myfile'); 
//adjust extension according to AudioFileFormat 
AudioSystem.write(ais,fileformat, audoutputfile); 
+0

Ồ. Tôi đã để ý ngày tháng của câu hỏi ... –