/ Dev / snd / में मज़े के लिए यादृच्छिक शोर उत्पन्न करना


41

हाल ही में मैं मंत्रमुग्ध / dev फ़ोल्डर की खोज कर रहा हूं। मैं कुछ शोर उत्पन्न करने के लिए एक ऑडियो डिवाइस पर कुछ यादृच्छिक डेटा लिखना चाहता हूं।

मैं एएलएसए का उपयोग कर रहा हूं।

इसलिए मैं बिल्ली / / फ़ोल्डर में प्लेबैक फ़ाइल के लिए कुछ यादृच्छिक डेटा पाइप करने के लिए बिल्ली ...

 cat file-of-random-data > /dev/snd/pcmC0D0p

तब मुझे लगता है कि बिल्ली से एक त्रुटि प्रतीत होती है

 cat: write error: File descriptor in bad state

मैं इसे कैसे ठीक कर सकता हूं ताकि मैं अपने साउंड कार्ड से कुछ स्वादिष्ट स्थिर खेल सुन सकूं?


1
मुझे लगता है कि आपको यादृच्छिक PCM डेटा भेजने की आवश्यकता है , या शायद आपको पहले कुछ ioctls के साथ डिवाइस सेट करने की आवश्यकता है - आप बस यादृच्छिक बाइट्स डंप नहीं कर सकते।
गिल्स एसओ- बुराई को रोकें '25

@Gilles विकिपीडिया के अनुसार, .wav PCM है और मुझे एक ही परिणाम मिलता है जब रैंडम फ़ाइल को .wav फ़ाइल से बदल दिया जाता है। मैं कुछ / बाहर नियंत्रण स्थापित करने की जाँच करेगा।
jones

क्या किसी के पास एक ट्यूटोरियल के लिए एक संकेतक है कि कुछ ioctls कैसे सेट करें? Ioctls नामक किसी चीज़ के लिए, मुझे लगा कि एक एपीआई के रूप में ALSA को इनपुट और आउटपुट के लिए इंटरफ़ेस प्रदान करना चाहिए?
jones

यहाँ एक कामकाजी उदाहरण है कि कैसे pcm डेटा को सीधे डिवाइस फ़ाइल में लिखें: github.com/igor-liferenko/pcm
इगोर लाइफरेंको

जवाबों:


46

मुझे लगता है कि यह कारण आपके लिए काम नहीं कर रहा है क्योंकि उस इंटरफ़ेस को हटा दिया गया है। आप आम तौर /dev/dspपर अब और कम से कम मुश्किल का उपयोग किए बिना ऑडियो नहीं लिख सकते ।

एक कार्यक्रम है जो आपके सिस्टम पर आपके लिए इसे पूरा करेगा padsp:। यह /dev/audioया /dev/dspनए ऑडियो सर्वर सिस्टम में फाइल को मैप करेगा ।

टर्मिनल को फायर करें और रूट मोड में जाएं sudo su

फिर, मैं cat /dev/urandomआउटपुट में जा रहा हूं padspऔर teeडेटा को भेजने के लिए कमांड का उपयोग करता हूं /dev/audio। आपको अपने टर्मिनल में एक टन कचरा मिलेगा, ताकि आप उसे अनुप्रेषित करना चाहें /dev/null

एक बार जब आप सुपरयुसर में हों, तो इस कमांड को आज़माएँ:

cat /dev/urandom | padsp tee /dev/audio > /dev/null

तुम भी अपने माउस की तरह, अन्य उपकरणों के साथ कोशिश करना चाहते हो सकता है: का उपयोग करें: /dev/psauxउदाहरण के लिए या यूएसबी चालक। आप इसके माध्यम से अपनी मेमोरी भी चला सकते हैं: /dev/mem

आशा है कि यह स्पष्ट करता है कि यह पहले क्यों काम नहीं कर रहा था।

व्यक्तिगत रूप से, मैंने माउस और मेमोरी को यादृच्छिक स्थिर खेलने की तुलना में अधिक दिलचस्प तरीके से पाया!


1
आपका बहुत बहुत धन्यवाद! यह वही है जिसे मैं देख रहा था। प्रश्न पोस्ट करने के बाद पूरे 7 महीने का उत्तर दिया! :-)
jones

3
ऐसा लगता है कि इसके लिए sudoविशेषाधिकारों की आवश्यकता नहीं है।
इरिन

2
बहुत बहुत धन्यवाद। मुझे अजीब तरह से दिलचस्प होने के लिए बायनेरी मिला। / usr / bin / ls / usr / bin / gnome-terminal / usr / bin / mysql जैसी चीजें
उज्ज्वल

हम्म, अजीब, 'टी' यह कर सकता है, लेकिन 'डी डी = / देव / ऑडियो' नहीं कर सकता।
जैसन

@ जैसन डी डी एक बार में बहुत ज्यादा लिख ​​सकता है। पैड एलिसा के माध्यम से इसे पुनर्निर्देशित करने के लिए अनुकरण / देव / ऑडियो का अनुकरण करता है। बिना पैड के dd भी तब तक / dev / ऑडियो नहीं देखेगा जब तक कि इन-कर्नेल OSS इम्यूलेशन सक्षम नहीं होता है (और डिफ़ॉल्ट रूप से यह नहीं है)। और मुझे लगता है कि एक बड़े ब्लॉक को लिखना, इन-ड्राइवर बफ़र्स की तुलना में बहुत बड़ा, विफल भी हो सकता है।
पॉल स्टेलियन

8

cat /dev/urandom | aplay वह आदेश है जिसे टाइप करने की आवश्यकता है। यदि आप "ऑडियो" समूह में नहीं हैं, तो आप sudo के साथ aplay को उपसर्ग कर सकते हैं। यह भी किसी भी डेमॉन के साथ हस्तक्षेप नहीं करता है (मैं चला रहा था, pulseaudioजबकि यह कमांड सक्रिय था और "शोर" को सही ढंग से सुना था।

EDIT (अगस्त 6, 2019): कमांड के पुराने संस्करण में मेरे पास और के padsp teeबीच एक चीज भी थी । अब जब मैं वास्तव में इस क्षेत्र में काम कर रहा हूं तो मुझे एहसास हुआ कि इसका कोई मतलब नहीं था। इसके अलावा, मुझे पता है कि अद्यतन कमांड (इस उत्तर की शुरुआत में दिखाई देने वाली) काम करती है क्योंकि मैं दिन में कई बार काम पर इसका उपयोग करता हूं।cataplay


6
मैं ALSA का उपयोग करता हूं, और "पैड्स टी" आवश्यक नहीं है।
गेरमीया

1
मेरे pulseaudio अनुभवों में (और पीए डाउन होने पर जो भी उबंटू उपयोग कर रहा है) padsp teeआवश्यक था (उस समय मेरे पास सटीक 12.04.2 था) बात यह है कि क्या आपको डेटा को सीधे उपकरणों में डंप करने की कोशिश नहीं करनी चाहिए, भले ही आप रूट थे ( जहाँ तक मुझे पता है कि कुछ फाइलें पढ़ने योग्य हैं और / देव फ़ोल्डर में कोई भी लिखने योग्य नहीं है), क्योंकि आप या तो एक त्रुटि प्राप्त कर सकते हैं (सबसे अच्छी स्थिति में, जो प्रत्येक अपडेट के साथ अधिक सामान्य हो जाती है), कर्नेल को क्रैश करें या डिवाइस को भी तोड़ दें, दुर्लभ मामलों में। इसे (ऑडियो समूह या रूट की आवश्यकता, दुर्भाग्य से) करने के लिए, अनलिमिटेड तत्वों का उपयोग करना चाहिए। @ एनीमिया
पॉल स्टेलियन

अजीब बात है कि अब मैं कैसे देखता हूं कि वह padsp teeचीज वास्तव में कोई मतलब नहीं रखती है। काम पर मैं उस लाइन के बिना कुछ इसी तरह का परीक्षण करता हूं कि मैं ऑडियो ड्राइवर लिखने के साथ प्रगति कर रहा हूं। अब अपना जवाब अपडेट करूंगा।
पॉल स्टेलियन

3

कोशिश करें / देव / ऑडियो या अन्य उपकरणों में से एक / देव / snd के तहत। उनमें से सभी ऑडियो डेटा सिंक नहीं हैं, आपने मिक्सर, माइक्रोफ़ोन या कुछ और पकड़ा हो सकता है


1
उत्तर के लिए धन्यवाद। / Proc / asound / उपकरणों / dev / SND / pcmC0D0p सही ऑडियो प्लेबैक के लिए (इसलिए 'पी') डिवाइस है के अनुसार
jones

1
इसके अलावा, मुझे यकीन नहीं है, लेकिन क्या प्लेबैक के लिए कई देव "फाइलें" हो सकती हैं? मेरे पास '/ dev / ऑडियो' नहीं है, मुझे लगता है कि '/ dev / ऑडियो' का OSS के साथ कुछ लेना-देना है, जो पुराने कर्नेल पर प्रयोग किया जाता है (2.5 से पहले)
jones

2

क्या pulseaudioडिवाइस पर लॉक लगाकर साउंड डेमॉन (जैसे ) है? मुझे लगता है कि आप यह पता लगा सकते हैं कि किसी अन्य चीज के माध्यम से इस पर एक हैंडल है या नहीं lsof


1
उपयोगी सुझाव के लिए धन्यवाद। मेरे पास एक चेक, उपयोग grepऔर था lsofpulseaudioउपयोग कर रहा है, /dev/snd/controlC0लेकिन यह चालू नहीं है /dev/snd/pcmC0D0p/var/lockडिवाइस पर लॉक के लिए कोई फ़ाइल थी या नहीं, यह जानने के लिए मैंने डबल चेक किया । ls -alबताता है कि फ़ोल्डर खाली है। तो मुझे लगता है कि वहाँ pcmC0D0p पर कोई ताला है
jones

@ जोंस कंट्रोल पर लॉक रखने के लिए ड्राइवर के आधार पर पूरे कार्ड को लॉक करने के लिए पर्याप्त हो सकता है। (8 साल बाद जवाब देने के लिए खेद है, अब मुझे पता चला है कि खुद)
पॉल स्टेलियन

0

TL; DR: डेटा को पढ़ने या लिखने से पहले डिवाइस के मापदंडों को निर्धारित किया जाना चाहिए।

क्रमशः:

  1. PCM डिवाइस खोलें। उदाहरण के लिए: fd = open("/dev/snd/pcmC0D0p", O_RDWR)। खुले होने के बाद, पीसीएम OPENराज्य में है।

  2. के साथ पैरामीटर सेट करें ioctl(fd, SNDRV_PCM_IOCTL_HW_PARAMS, (struct snd_pcm_hw_params*) p)। हार्डवेयर पैरामीटर संरचना में मास्क (प्रत्येक बिट एक मान है) और अंतराल ([न्यूनतम, अधिकतम] सीमा) है। जो पैरामीटर सेट नहीं किए जा रहे हैं उन्हें भरा जाना चाहिए (सभी बिट्स / मान मास्क के लिए सेट किए गए हैं; अंतराल के लिए पूर्ण सीमा)। हार्डवेयर पैरामीटर सेट करने के बाद, पीसीएम SETUPराज्य में है। कोड के लिए TinyALSA का pcm_set_config () देखें ।

    स्थापना ACCESS, FORMAT, RATE, CHANNELS, PERIOD_SIZEऔर PERIODSपर्याप्त है। अन्य पैरामीटर इनमें से भिन्न हैं, सिवाय इसके BUFFER_SIZEकि कुछ उपकरणों में एक से अधिक के लिए सेट किया जा सकता है PERIOD_SIZE

  3. ioctl(fd, SNDRV_PCM_IOCTL_PREPARE)डिवाइस और एएलएसए रनटाइम चर तैयार करने के लिए कॉल करें। इसके बाद, पीसीएम PREPAREDराज्य में है।

  4. पढ़ना (कैप्चर करना) या लिखना (प्लेबैक) शुरू करें।

एक पीसीएम डिवाइस को पढ़ने या लिखने के लिए एक न्यूनतम आवेदन में इसका अधिकांश कोड हार्डवेयर मापदंडों में हेरफेर होगा।


मुझे यकीन नहीं है कि वास्तविक पढ़ना / लिखना काम है, क्योंकि aplay का उपयोग करता है (कम से कम मैं जिस सिस्टम पर विकसित कर रहा हूं) ioctl (fd, SNDRV_PCM_IOCTL_WRITEI_FRAMES, ...) और प्लेबैक पर एक वास्तविक लेखन () कॉल नहीं। क्या ALSA के पास खुद एक रैपर है जो पढ़ने / लिखने के एंट्री पॉइंट लेता है और उन्हें ioctl में ट्रांसलेट करता है?
पॉल स्टेलियन

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.