सी

2012-04-09 42 views
9

में लिनक्स पर बीप सिस्टम बीपर का उपयोग करके एक विशिष्ट आवृत्ति और लंबाई (विभिन्न ध्वनि संकेतों के लिए) के साथ एक बीप ध्वनि उत्पन्न करना चाहता है (और केवल स्पीकर अगर बीपर उपलब्ध/सुलभ नहीं है)। मुझे पता है कि ioctl का उपयोग कर ऐसा करना संभव है, लेकिन इसके लिए रूट पहुंच की आवश्यकता है, जिसे मैं नहीं चाहता हूं।सी

मुझे पता है कि मैं सिर्फ "बीप" कमांड का उपयोग कर सकता हूं, लेकिन यह निर्भरता होगी, यदि संभव हो, तो इसका उपयोग नहीं किया जाना चाहिए (बिल्कुल बाह्य निर्भरता नहीं, केवल मूल लिनक्स पुस्तकालयों और सी)।

क्या मैं वर्तमान में निम्नलिखित कोड है (लेकिन यह सुपर उपयोगकर्ता विशेषाधिकार को चलाने के लिए की आवश्यकता है):

#include <stdlib.h> 
#include <fcntl.h> 
#include <linux/kd.h> 

int main(int argc, char *argv[]) 
{ 
int fd = open("/dev/console", O_RDONLY); 
if (fd == -1 || argc != 3) return -1; 
return ioctl(fd, KDMKTONE, (atoi(argv[2])<<16)+(1193180/atoi(argv[1]))); 
} 

अगर वहाँ यह करने के लिए कोई दूसरा रास्ता नहीं है, तो मैं बीप उपयोग करेगा, लेकिन मैं वास्तव में की तरह होगा निर्भरताओं से बचने के लिए और सीधे मेरी लिपि में बीप को एकीकृत करने के लिए, लेकिन मुझे यकीन है कि यहां कोई समाधान/समाधान का पता लगाएगा।

मैं वास्तव में बाहरी पुस्तकालयों को नहीं चाहता क्योंकि कार्यक्रम जितना संभव हो उतना हल्का होना चाहिए।

+0

यदि डेस्कटॉप के नीचे चल रहा है, तो आप ALSA का उपयोग कर सकते हैं। और आप 'play' कमांड का भी उपयोग कर सकते हैं ... और कुछ डेस्कटॉप में अधिसूचनाएं हैं ... –

+0

@ बेसिलस्टारनकेविच क्या यह अधिक जटिल चीजें नहीं होगी? मैं सिर्फ एक विशिष्ट आवृत्ति और लंबाई के साथ एक साधारण बीप चाहता हूँ। जैसा कि मैंने पहले ही पाब्लो को बताया है, मैं इसे जितना संभव हो उतना हल्का वजन रखना चाहता हूं, लेकिन मुझे लगता है कि रूट पहुंच प्राप्त करने के लिए बीप या सूड का उपयोग करना है, तो फिर? – omnidan

+0

देखें कि [यह] (http://stackoverflow.com/questions/412789/windows-beep-equivalent-for-linux) आपकी सहायता करता है। @paxdiablo का दावा है कि यह उपयोगकर्ता खाते से भी चलाया जा सकता है। –

उत्तर

3

मुझे लगता है कि ऐसा करने का एकमात्र तरीका या तो अपने स्वयं के प्रोग्राम रूट पहुंच देने के लिए, या beep का उपयोग करने के लिए सूड का उपयोग करना है, जो पहले से ही उपयुक्त है। मुझे लगता है कि मैं सिर्फ एक और निर्भरता जोड़ूंगा, फिर beep वैसे भी बहुत बड़ा नहीं है।

सभी उत्तरों के लिए धन्यवाद, मुझे यकीन है कि अन्य पुस्तकालय अधिक जटिल सिग्नल के लिए बहुत अच्छे हैं, लेकिन मुझे एक बहुत ही सरल आवश्यकता है!

मुझे लगता है कि इस प्रश्न को हल/बंद के रूप में चिह्नित किया जा सकता है।

किसी को भी एक बीप सुपर उपयोगकर्ता-विशेषाधिकारों के बिना कंसोल का उपयोग कर बनाने के लिए एक तरह से मिलता है, तो मैं अभी भी इस समाधान :)

आप सब फिर से धन्यवाद में दिलचस्पी रखता हूँ।

0

OpenAL जैसी ऑडियो लाइब्रेरी का उपयोग करने का प्रयास करें।

+0

का उत्पादन करने के लिए कई ध्वनि जनरेटर को कॉल करने का प्रयास करती है, मैं प्रोग्राम को जितना संभव हो उतना हल्का वजन रखना चाहता हूं – omnidan

+0

फिर आउटपुट घंटी वर्ण '\ a' और टर्मिनल एमुलेटर में ध्वनि बनाने को छोड़ दें। बेशक, आप उस ध्वनि की पिच और टोन नहीं बदल सकते हैं ... –

+0

@ बेसिलस्टारनकेविच हाँ, बेशक यह भी संभव है, लेकिन मैं विशिष्ट आवृत्तियों को सिग्नल को थोड़ा अलग करना चाहता हूं। – omnidan

2

सबसे बुनियादी बीप अभी भी '\' एक, अपने टर्मिनल यह समर्थन करता है तो है:

fprintf(stdout, "\aBeep!\n"); 
+0

हाँ है, लेकिन यह केवल एक आवृत्ति है। – omnidan

+0

मैंने कहा कि यह मूल था ... इसके बारे में क्षमा करें। (प्रतिक्रिया अभी भी उन लोगों के लिए उपयोग योग्य हो सकती है जो बाद में इस पृष्ठ पर जाते हैं।) – wildplasser

+0

आउटपुट रीडायरेक्ट होने पर भी बहुत अच्छा काम नहीं करता है। –

4

कृपया मानक linux beep स्रोत कोड को देखो। http://www.johnath.com/beep/beep.c

यह "बीप" के लिए KIOCSOUND ioctl का उपयोग करता है, लेकिन आपको इसे खेलने के लिए सुपरसुर विशेषाधिकारों की आवश्यकता नहीं है। मैंने इसे "बीप" समूह पर उपयोगकर्ताओं द्वारा पठनीय और निष्पादन योग्य बनाने के लिए कॉन्फ़िगर किया है।

तो यूआईडी 1000 के साथ मेरा मानक उपयोगकर्ता समूह में जीआईडी ​​501 (जिसे इसे "बीप" कहा जाता है) में है। इसके आगे मुझे chmod 4750 /usr/bin/beep था और अब मैं सुपरसुर विशेषाधिकारों के बिना पूछे जाने वाले बीप (20-20000 हर्ट्ज में) खेलने में सक्षम हूं।

 संबंधित मुद्दे

  • कोई संबंधित समस्या नहीं^_^