منصوبے کے بارے میں
Oto (v) ایک نچلی سطح کی Go لائبریری ہے جو آواز چلانے کے لیے استعمال ہوتی ہے۔ یہ آڈیو ہارڈویئر کے قریب رہنے کے لیے ڈیزائن کی گئی ہے، اور ڈی کوڈنگ اور اعلیٰ سطح کی آڈیو ہینڈلنگ کال کرنے والے کے سپرد کرتی ہے۔
پلیٹ فارمز
Oto Windows، macOS، Linux، FreeBSD اور OpenBSD کو Cgo کے بغیر سپورٹ کرتی ہے۔ یہ Android، iOS، WebAssembly (Cgo کی ضرورت نہیں)، Nintendo Switch اور Xbox کو بھی معاون اہداف کے طور پر درج کرتی ہے۔ کچھ پلیٹ فارمز پر Go کے استعمال کے لیے C/C++ کمپائلر کا راستے میں موجود ہونا ضروری ہے؛ کنسول اہداف کے لیے ممکن ہے کہ کام کرنے والا C/C++ ٹول چین درکار ہو۔
پلیٹ فارم نوٹس
macOS پر AudioToolbox.framework درکار ہے مگر خودکار طور پر لنک ہو جاتا ہے۔ iOS پر AVFoundation.framework اور AudioToolbox.framework کو Xcode پروجیکٹ کے لنک شدہ فریم ورکس میں شامل کرنا ضروری ہے۔ Linux اور BSD پر Oto خالص Go پیکیج github.com/jfreymuth/pulse کے ذریعے PulseAudio استعمال کرتی ہے؛ اگر PulseAudio سرور قابلِ دریافت نہ ہو تو PULSE_SERVER ماحولیاتی متغیر سیٹ کیا جا سکتا ہے۔ جب کوئی PulseAudio سرور قابلِ رسائی نہ ہو تو Oto ALSA پر واپس چلی جاتی ہے، جس کے لیے بھی Cgo درکار نہیں: libasound.so.2 رن ٹائم پر متحرک طور پر لوڈ ہوتی ہے، اس لیے بلڈ کے لیے ALSA ڈیولپمنٹ ہیڈرز کی ضرورت نہیں، البتہ رن ٹائم پر شیئرڈ لائبریری کا موجود ہونا ضروری ہے۔ FreeBSD پر CGO_ENABLED=0 کے ساتھ بلڈ کرنے کے لیے purego fakecgo پیکیج کے لیے ایک مخصوص gcflags سیٹنگ بھی درکار ہوتی ہے، جبکہ Cgo فعال کے ساتھ نیٹو بلڈز کو کچھ اضافی درکار نہیں۔
بنیادی تصورات
دو اہم اجزاء Context اور Player ہیں۔ ایک Context OS اور آڈیو ڈرائیورز کے ساتھ معاملہ کرتا ہے، اور فی پروگرام صرف ایک ہی context ہو سکتا ہے۔ ایک context سے آپ کسی بھی تعداد میں Players بنا سکتے ہیں، ہر ایک کو ایک io.Reader دیا جاتا ہے جس سے وہ آواز کی نمائندگی کرنے والے بائٹس پڑھتا ہے۔ ایک ہی io.Reader کو متعدد players میں شیئر نہیں کرنا چاہیے۔
استعمال
Context بنانے کے لیے oto.NewContextOptions استعمال ہوتا ہے جس کے فیلڈز میں SampleRate (عام طور پر 44100 یا 48000)، ChannelCount (مونو کے لیے 1 یا اسٹیریو کے لیے 2) اور Format (مثلاً oto.FormatSignedInt16LE) شامل ہیں۔ oto.NewContext context، ایک ready چینل اور ایک error واپس کرتا ہے؛ کال کرنے والا استعمال سے پہلے ready چینل پر انتظار کرتا ہے اور پھر context کی error چیک کرتا ہے۔ Players otoCtx.NewPlayer(reader) سے بنائے جاتے ہیں، paused حالت میں شروع ہوتے ہیں، اور Play() غیر ہم وقت ساز (asynchronous) ہے۔ IsPlaying() کو پول کیا جا سکتا ہے تاکہ تکمیل کا انتظار ہو، اور Seek() آواز کے اندر دوبارہ پوزیشن مقرر کرنے دیتا ہے۔
آوازیں میموری سے چلائی جا سکتی ہیں، یعنی فائل کو byte slice میں پڑھ کر bytes.Reader میں لپیٹ کر، یا اسٹریمنگ کے ذریعے، یعنی *os.File کو براہِ راست ڈی کوڈر کو دے کر۔ اسٹریمنگ کے وقت فائل آبجیکٹ کو زندہ رکھنا اور پلے بیک مکمل ہونے تک بند نہ کرنا ضروری ہے، ورنہ پلے بیک میں اسٹیٹک پیدا ہو سکتی ہے۔
اعلیٰ درجے کا استعمال
Players اندرونی آڈیو ڈیٹا برقرار رکھتے ہیں، اس لیے io.Reader سے پڑھے گئے بائٹس کا مطلب یہ نہیں کہ وہ آڈیو ڈیوائس کے ذریعے پہلے ہی چلائے جا چکے ہیں۔ ڈیٹا io.Reader سے اندرونی بفر اور پھر آڈیو ڈیوائس تک جاتا ہے، اور دوسرے مرحلے کی ٹائمنگ کی ضمانت نہیں، اس لیے معمولی تاخیر ممکن ہے۔ Player.BufferedSize() بفر شدہ ڈیٹا کی مقدار بتاتا ہے، اور SetBufferSize() بنیادی بفر کا سائز ایڈجسٹ کرتا ہے۔ NewPlayer ایک *oto.Player واپس کرتا ہے جس میں SetBufferSize اور Seek جیسے میتھڈز ہوتے ہیں۔
کراس کمپائلنگ
macOS، Windows، Linux یا کسی بھی متعلقہ BSD فلیور کے لیے کراس کمپائلنگ GOOS کو darwin، windows، linux یا متعلقہ BSD نام پر سیٹ کر کے کی جاتی ہے۔ دیگر پلیٹ فارمز کے لیے ہدف آرکیٹیکچر کی لائبریریاں انسٹال کرنا اور CGO_ENABLED=1 سیٹ کرنا ضروری ہے، کیونکہ Go کراس کمپائلز پر بطور ڈیفالٹ Cgo غیر فعال کر دیتا ہے۔
Comments
0 people shared their preference · Deer Point appears after 10 participants
Sign in to join the discussion.