
कुछ समय पहले, मैंने मैक पर स्विच किया और रोजमर्रा के उपयोग के लिए सॉफ़्टवेयर चुनना शुरू किया। समस्या ऑडियो प्लेयर के साथ उत्पन्न हुई। मैंने कई खिलाड़ियों की कोशिश की, लेकिन किसी ने मुझे अनुकूल नहीं किया। इसलिए मैंने खुद लिखने का फैसला किया। उसी समय, मैं मैक के लिए ओब्जेक्टिव-सी पर विकास की कोशिश करने में रुचि रखता था।
नतीजतन, मुझे एक
रिप्ले खिलाड़ी मिला, जिसका अर्थ है "निवासी खिलाड़ी":
ऑडियो प्लेयर आवश्यकताएँ
ऑडियो प्लेयर क्या होना चाहिए, इसके बारे में, मेरे निम्नलिखित विचार हैं:
1. ऑडियो प्लेयर को ग्राफिकल इंटरफ़ेस की आवश्यकता नहीं है।
ध्वनि पृष्ठभूमि में आती है, आपको इसे देखने की आवश्यकता नहीं है, इसलिए ऑडियो प्लेयर के लिए किसी भी प्रकार के चित्रमय इंटरफ़ेस बनाने की आवश्यकता नहीं है। बेशक, खिलाड़ी को किसी तरह नियंत्रित करने की आवश्यकता होती है, लेकिन सभी नियंत्रणों को केवल चार बटन तक घटाया जा सकता है - मेनू, स्टार्ट / पॉज़, अगला और पिछला ट्रैक।
ये बटन पूरी तरह से स्टेटस बार में फिट होते हैं, जहाँ ये हमेशा एक क्लिक की दूरी पर होते हैं। और एक खुले एप्लिकेशन से फ़ोकस स्विच करने की कोई आवश्यकता नहीं है।
2. ऑडियो प्लेयर को अपनी लाइब्रेरी की आवश्यकता नहीं है।
संगीत भंडारण का आयोजन फ़ाइल सिस्टम का उपयोग करके किया जाता है। अधिकांश मामलों में, एक संगीत संग्रह में एक पदानुक्रमित संरचना होती है (उदाहरण के लिए, शैली - कलाकार - एल्बम - ट्रैक), जिसे फ़ाइल सिस्टम के सबफ़ोल्डर्स का उपयोग करके समस्याओं के बिना पुन: प्रस्तुत किया जाता है। इसके अलावा, फ़ोल्डरों से आप id3 टैग के सीमित सेट की तुलना में अधिक शाखात्मक संरचना बना सकते हैं।
इसके अलावा, साधारण फ़ाइलों के साथ यह विभिन्न जोड़तोड़ करने के लिए बहुत अधिक सुविधाजनक है जो वास्तव में सुनने के साथ जुड़े नहीं हैं। मान लें कि लाइब्रेरी से निर्यात करने की तुलना में फ़ाइलों के साथ कुछ फ़ोल्डरों को सीधे कॉपी करना, या जहां लाइब्रेरी में प्रदर्शित फ़ाइलों को संग्रहीत किया जाता है, वास्तव में इसे खोजना बहुत आसान है।
3. ऑडियो प्लेयर को प्लेलिस्ट की आवश्यकता नहीं है।
यदि आपके पास फ़ाइल सिस्टम में पटरियों का एक सुव्यवस्थित, संरचित संग्रह है, तो बस प्लेबैक के लिए आवश्यक फ़ोल्डर खोलें। यदि आप चाहते हैं - एक एल्बम खोलें, यदि आप चाहते हैं - कई अलग-अलग एल्बम, यदि आप चाहते हैं - अपने सभी एल्बमों के साथ एक कलाकार।
फ़ाइलों और खिलाड़ी के बीच एक परत बनाने की आवश्यकता नहीं है, खिलाड़ी को डिस्क की सामग्री को "जैसा है" खेलना चाहिए।
डिज़ाइन
उस क्षण तक, मैंने कभी भी मैक के लिए सामान्य और विशेष रूप से ऑब्जेक्टिव-सी में प्रोग्राम नहीं किया था। इसलिए मैंने खिलाड़ी को ऑब्जेक्टिव-सी के अध्ययन के समानांतर लिखा।
जैसा कि यह निकला, नेटवर्क पर रूसी में मैक के विकास पर बहुत कम लेख हैं। देशी Apple दस्तावेज़ीकरण शायद बहुत कुछ दे सकता है, लेकिन यह बहुत बड़ा है, मेरे लिए इसे अंग्रेजी में पढ़ना मुश्किल है। ज्यादातर जानकारी, ज्यादातर कोड उदाहरण, मुझे स्टैकऑवरफ्लो जैसे अंग्रेजी-भाषा संसाधनों पर आकर्षित करना था।
मुझे ठीक से पता था कि खिलाड़ी कैसा होना चाहिए, उसे कैसा दिखना चाहिए और उसकी क्या कार्यक्षमता होनी चाहिए। इसलिए, मेरे पास कुछ विचारशील, डिजाइनिंग चरण नहीं था। मुझे अभी-अभी आए प्रत्येक प्रश्न के चरण मिले और कोड को वहीं लिखा। इस प्रक्रिया में, मैंने अपने एलजे में कुछ नोट्स भी लिखे- Xcode को कैसे कॉन्फ़िगर करें, एप्लिकेशन आइकन को स्टेटस बार में कैसे रखें, फ़ाइलों को कैसे पढ़ें, आदि। अपने लिए एक प्रकार की पाठ्यपुस्तक।
सबसे कठिन मुद्दा ध्वनि प्रजनन था। मैंने
एनएसएसाउंड क्लास के साथ प्रयोग करना शुरू कर दिया। जैसा कि मैं इसे समझता हूं, यह ऑब्जेक्टिव-सी में ध्वनि बजाने के लिए एक प्रकार का "मानक" वर्ग है। पहली बार, जब मुझे ध्वनि बजाने के लिए यह वर्ग नहीं मिला, तो मैं अगले एक को लॉन्च करने के लिए ट्रैक समाप्त होने के क्षण को नहीं पकड़ सका। मुझे यह आभास होने लगा कि NSSound क्लास का खिलाड़ी में उपयोग करने का इरादा नहीं है, बल्कि इसे एक बार एक छोटी ध्वनि चलाने की आवश्यकता है, जैसे कि फ़ाइल अपलोड के अंत के बारे में संकेत, या ऐसा कुछ।
तब मैंने
एवी फाउंडेशन ढांचे का पता लगाने की कोशिश करने का फैसला किया, आप निश्चित रूप से इस पर एक खिलाड़ी लिख सकते हैं। हालांकि, यह किसी भी तरह हुआ कि मुझे एनएसएसाउंड बनाने के लिए आवाज़ देने के तरीके के साथ प्रेरित किया गया था, और मैंने सीखा कि कैसे मैं ट्रैक के अंत को पकड़ सकता हूं। और मैंने एनएसएसाउंड आधारित खिलाड़ी बनाया।
दुर्भाग्य से, यह वर्ग भयानक बल के साथ स्मृति को खाता है। प्रत्येक नए ट्रैक को चलाने के लिए एक निश्चित मात्रा में मेमोरी आवंटित की जाती है, और ट्रैक के अंत के बाद मेमोरी को मुक्त नहीं किया जाता है। यहाँ या तो मुझे कुछ समझ में नहीं आ रहा है और बस कुटिलता से कोड लिखा है, या एनएसएसाउंड वास्तव में केवल एक निश्चित ध्वनि के एक ही प्रजनन के लिए अभिप्रेत है। मैं बहुत आभारी रहूंगा अगर उन लोगों को पता होगा जो सवाल जानते हैं कि इस समस्या को कैसे दूर किया जाए।
अन्य समस्याएँ, जैसे फ़ाइलें पढ़ना या मेनू बनाना, मुझे जटिल नहीं लगा। खैर, किसी भी अन्य प्रश्नों की तुलना में अधिक जटिल नहीं है जो एक नई तकनीक का अध्ययन करते समय उत्पन्न होते हैं। खिलाड़ी के निर्माण के समय, मैंने एलजे में कई नोट भी लिखे।
परिणाम
नतीजतन, मैंने खुद के लिए एक ऑडियो प्लेयर लिखा जो मुझे पूरी तरह से सूट करता है। और अब मैं सभी के साथ परिणाम साझा करना चाहता हूं।
रिप्ले एक खुला और पूरी तरह से मुक्त खिलाड़ी है।
सभी स्रोत कोड गिथब पर हैं , उन विशेषताओं की एक छोटी सूची भी है जिन्हें मैं अभी भी रिप्ले से जोड़ना चाहता हूं।
मैं सिर्फ किसी भी टिप्पणी और सुझाव, साथ ही अनुरोधों को खींचूंगा :)
युपीडी। मैंने AVFoundation पर खिलाड़ी को फिर से लिखा।
UPD2। यह लेख लगभग एक साल के लिए प्रारूप के रूप में था, इसलिए कुछ पुरानी टिप्पणियां अब प्रासंगिक नहीं हो सकती हैं।