2010-01-24 57 views
7

Tôi đang làm việc trên bộ hẹn giờ ở trăn mà âm thanh kêu vang khi thời gian chờ kết thúc. Tôi sử dụng mã sau:Cách phát âm thanh bằng Python KHÔNG làm gián đoạn âm nhạc/các âm thanh khác phát khi đang chơi

from wave import open as wave_open 
from ossaudiodev import open as oss_open 

def _play_chime(): 
    """ 
    Play a sound file once. 

    """ 
    sound_file = wave_open('chime.wav','rb') 
    (nc,sw,fr,nf,comptype, compname) = sound_file.getparams() 
    dsp = oss_open('/dev/dsp','w') 
    try: 
     from ossaudiodev import AFMT_S16_NE 
    except ImportError: 
     if byteorder == "little": 
     AFMT_S16_NE = ossaudiodev.AFMT_S16_LE 
     else: 
     AFMT_S16_NE = ossaudiodev.AFMT_S16_BE 
    dsp.setparameters(AFMT_S16_NE, nc, fr) 
    data = sound_file.readframes(nf) 
    sound_file.close() 
    dsp.write(data) 
    dsp.close() 

Nó hoạt động khá tốt, trừ khi bất kỳ thiết bị nào khác đã được xuất âm thanh.

Làm thế nào tôi có thể làm cơ bản giống nhau (dưới Linux) mà không có điều kiện tiên quyết mà không có âm thanh nào đang được phát?

Nếu bạn nghĩ rằng quá trình này sẽ đòi hỏi một API để đảm bảo phần mềm trộn, xin đề nghị một phương pháp :)

Thx cho sự ủng hộ :)

+0

Không có hệ thống âm thanh hiện đại nào chỉ có thể xử lý một luồng tại một thời điểm. –

Trả lời

8

Câu trả lời đơn giản là "Chuyển từ OSS để PulseAudio." (Hoặc thiết lập ALSA để sử dụng dmix, hoặc nhận soundcard có trình điều khiển Linux tốt hơn ...)

Câu trả lời phức tạp hơn là mã của bạn đã hoạt động theo cách bạn muốn ... trên một số soundcard. Trình điều khiển OSS có thể hiển thị các trình trộn phần cứng để bạn có thể có nhiều luồng âm thanh phát cùng một lúc hoặc có thể hiển thị một luồng dẫn đến âm thanh chặn mà bạn nhìn thấy trên hệ thống của mình. Giải pháp chính xác duy nhất ở đây là sử dụng API đảm bảo việc trộn phần mềm.

+0

Thx cho thông tin clee. Tôi đoán câu hỏi được mở rộng bằng cách thêm "Nếu giải pháp yêu cầu một API đảm bảo phần mềm trộn, thì nó nên là gì?" Chúc mừng – Morlock

+1

Đó là lý do tôi đề xuất PulseAudio. Theo mặc định, daemon pulseaudio xử lý phần mềm trộn cho bạn. – clee

+0

Phải, tôi đã đọc câu trả lời của bạn hai lần. Tôi sẽ xem PulseAudio. Thx – Morlock

1

Phần cứng và trình điều khiển hiện đại hỗ trợ nhiều luồng. Vì vậy, trừ khi bạn đang chạy với phần cứng cổ hoặc một trình điều khiển crappy, nó sẽ làm việc anyway.

Có nói rằng, ALSA có thể cung cấp cho bạn nhiều quyền kiểm soát hơn OSS. Hầu hết các hạt nhân được vận chuyển hiện nay đều hỗ trợ cả hai.

+0

Tôi chắc chắn sẽ thử Alsa. Tôi vừa xác minh và đây là những gì card âm thanh của tôi đang sử dụng. – Morlock

Các vấn đề liên quan