কম্পিউটার টিউটোরিয়াল

রুবি FFI ব্যাখ্যা: VLC দিয়ে MP3 প্লে করুন – একটি প্র্যাক্টিক্যাল টিউটোরিয়াল

আমি একটি সিম্পল প্রশ্নের উত্তর দিতে চাই…

রুবিতে FFI কী?

FFI মানে "Foreign Function Interface"।

এটি অন্য প্রোগ্রামিং ল্যাঙ্গুয়েজে ডিফাইন করা ফাংশন ব্যবহার করার একটি পথ।

রুবির FFI মডিউল আপনাকে এক্সটার্নাল লাইব্রেরি এবং কোড এক্সেস দেয় যা আপনার কাছে অন্যথায় থাকত না।

আমরা প্রায়শই এটিকে C কোডের সাথে কাজ করতে ব্যবহার করি।

উদাহরণগুলো شامل:

  • rb-inotify
  • ruby-vips
  • ruby-nfc

আপনি FFI মডিউলের সাহায্যে নিজের প্রোগ্রাম লিখতে পারেন যা FFI ব্যবহার করে।

কীভাবে?

চলুন কিছু কোড উদাহরণ দেখি!

FFI বেসিকস: ফাংশন লোড ও ইম্পোর্ট করা

আপনি FFI-র সাথে কাজ করতে পারেন এর ফাংশনগুলোকে আপনার তৈরি করা একটি মডিউলে ইনক্লুড করে।

এভাবে:

require 'ffi'
module A
  extend FFI::Library
end

তারপর, মডিউলের ভিতরে, আমরা ffi_lib মেথড ব্যবহার করে একটি লাইব্রেরি লোড করব।

একটি C লাইব্রেরি, যেমন উইন্ডোজে "DLL", বা লিনাক্সে "SO", একটি "সিম্বলস" বা ফাংশন ডেফিনিশন্সের লিস্ট এক্সপোর্ট করে যা একটি প্রোগ্রাম অন্যদের জন্য উপলব্ধ করে।

চলুন "libc"-রিকোয়ার করি, C-এর স্ট্যান্ডার্ড লাইব্রেরি।

এভাবে:

module A
  extend FFI::Library
  ffi_lib 'c'
end

এখন:

আপনি এই লাইব্রেরি থেকে নির্দিষ্ট ফাংশনগুলো রুবি মেথড হিসেবে ইম্পোর্ট করতে পারেন।

attach_function মেথড দিয়ে।

এখানে একটি উদাহরণ:

module A
  extend FFI::Library
  ffi_lib 'c'
  attach_function :strlen, [:string], :int
end
A.strlen("abc") # 3

এটি কীভাবে কাজ করে?

প্রথমে, আমরা জানি C-তে strlen নামে একটি ফাংশন রয়েছে, এই ফাংশন chars * আর্গুমেন্ট হিসেবে নেয়।

chars * রুবিতে String-এ ট্রান্সলেট হয়।

তারপর…

এই strlen ফাংশন একটি মান রিটার্ন করে, যা স্ট্রিংয়ের দৈর্ঘ্য।

অন্য কথায়, attach_function ৩টি প্যারামিটার নেয়:

  1. C ফাংশনের নাম
  2. আর্গুমেন্ট টাইপের একটি অ্যারে
  3. একটি রিটার্ন টাইপ

আপনাকে ডকুমেন্টেশন পড়ে জানতে হবে কোন ফাংশন কোন টাইপের সাথে কাজ করে।

আরেক উদাহরণের সময়!

আপনার নিজের মিডিয়া প্লেয়ার বানান

আপনি অনেক আকর্ষণীয় লাইব্রেরি খুঁজে পেতে পারেন।

লিনাক্সে, অধিকাংশ /usr/lib/ ডিরেক্টরিতে থাকে, তাদের নামের শুরুতে "lib" থাকে এবং শেষে "so" এক্সটেনশন থাকে।

এভাবে লিস্ট করুন:

ls /usr/lib/lib*.so

এই উদাহরণের জন্য, আমরা VLC-এর মিডিয়া প্লেয়ার লাইব্রেরি ব্যবহার করব:

/usr/lib/libvlc.so

আমাদের লক্ষ্য হলো একটি mp3 ফাইল লোড করা এবং প্লে করা!

এভাবে শুরু করি:

require 'ffi'
module VLC
  extend FFI::Library
  ffi_lib 'vlc'
  attach_function :libvlc_get_version, [], :string
end

এটি আপনাকে লাইব্রেরি সঠিকভাবে লোড হচ্ছে কিনা টেস্ট করতে এবং এর ভার্সন প্রিন্ট করতে দেবে।

এভাবে:

VLC.libvlc_get_version # "3.0.6 Vetinari"

আপনি এই মেথডগুলোর একটি কাস্টম নাম দিতে পারেন ৪র্থ প্যারামিটার যোগ করে।

উদাহরণ:

attach_function :get_version, :libvlc_get_version, [], :string

তারপর আপনি করতে পারেন:

VLC.get_version

এখন একটি mp3 প্লে করার জন্য কী দরকার?

ডকুমেন্টেশন দেখলে, libvlc_media_player_play ফাংশনটি পথটি দেখাচ্ছে।

এই ফাংশন একটি মিডিয়া প্লেয়ার "অবজেক্ট" চায়।

একটি মিডিয়া প্লেয়ার একটি মিডিয়া চায়, এবং একটি মিডিয়া একটি VLC ইনস্ট্যান্স চায়।

প্রক্রিয়াটি:

VLC instance -> media -> media_player -> play

আমি libVLC-র ডকুমেন্টেশন পড়ে এটি জোড়া করেছি।

রুবিতে মেমরি পয়েন্টার???

C-তে আপনি কোনো অবজেক্ট খুঁজে পাবেন না, সবকিছু মেমরি পয়েন্টারের মাধ্যমে হ্যান্ডেল হয়।

একটি মেমরি পয়েন্টার হলো ডেটাসহ একটি মেমরি অ্যাড্রেস।

একটি কোড উদাহরণ দেখা যাক:

module VLC
  extend FFI::Library
  ffi_lib 'vlc'
  attach_function :get_version, :libvlc_get_version, [], :string
  attach_function :new, :libvlc_new, [:int, :int], :pointer
end
VLC.new(0, 0) # FFI::Pointer address=0x000055c6f04ae7b0

VLC.new কল করার ফলস্বরূপ আমরা একটি পয়েন্টার পাই।

আমাদের এটিকে অন্যান্য C ফাংশনগুলোর কাছে পাস করতে হবে যেগুলো এটিকে দরকার।

এখন:

পুরো উদাহরণ এবং কীভাবে ব্যবহার করবেন।

module VLC
  extend FFI::Library
  ffi_lib 'vlc'
  attach_function :version, :libvlc_get_version, [], :string
  attach_function :new, :libvlc_new, [:int, :int], :pointer
  attach_function :libvlc_media_new_path, [:pointer, :string], :pointer
  attach_function :libvlc_media_player_new_from_media, [:pointer], :pointer
  attach_function :play, :libvlc_media_player_play, [:pointer], :int
  attach_function :stop, :libvlc_media_player_stop, [:pointer], :int
  attach_function :pause, :libvlc_media_player_pause, [:pointer], :int
end

সঙ্গীত বাজাতে এটিই যথেষ্ট:

vlc = VLC.new(0, 0)
media = VLC.libvlc_media_new_path(vlc, "/home/jesus/Downloads/meditation.mp3")
player = VLC.libvlc_media_player_new_from_media(media)
VLC.play(player)

এটি কোনো ভিজুয়াল ইন্টারফেস খুলে না গান বাজাবে।

আপনি এর ওপর আপনার নিজের ওয়েব ইন্টারফেস বানাতে পারেন।

এবার ট্রাই করুন!

সারসংক্ষেপ

আপনি FFI-র চমৎকার শক্তি সম্পর্কে শিখেছেন! একটি রুবি মডিউল যা আপনাকে এক্সটার্নাল লাইব্রেরিগুলো ব্যবহার করতে দেয় যেন সেগুলো ল্যাঙ্গুয়েজের অংশ হয়।

দয়া করে এই আর্টিকেল শেয়ার করুন যাতে আরও মানুষ এর আনন্দ নিতে পারে 🙂

পড়ার জন্য ধন্যবাদ!

  1. রুবিতে সিলেকশন সর্ট মাস্টার করুন: স্টেপ-বাই-স্টেপ ইমপ্লিমেন্টেশন

  2. গুগল TCMalloc দিয়ে রুবির মেমরি অ্যালোকেশন প্রোফাইলিং

  3. রুবি পার্সিং মास্টার: স্ক্র্যাচ থেকে নিজস্ব পার্সার বানান

  4. রেডিস GEORADIUSBYMEMBER ব্যবহার: উদাহরণসহ ব্যাবহারিক গাইড