Volkan Atasever

mühendislik, edebiyat, retro computer, yazılım, şiir, nümismatik, bilişim, podcast ve daha bir çok yazılarım...

Türkçe içerikli VB Kodlama Standartları

clock Şubat 10, 2011 11:16 by author Volkan Atasever

Kadir Çamoğlu önderliğinde ve proje koordinatörlüğünde giriştiğimiz kodlama standartları serisinde C# programlama dilinin ardından VB.NET içinde kodlama standartlarını oluşturduk. Bu gönüllü projede yazarlık dışında Editörlük görevinide yerine getirdim. Tüm yazarların kendi deneyimlerinden yola çıkarak hazırladığı bu döküman ülkemizdeki türkçe içerikli kodlama standartlarının ilk örneklerinden. Bu çalışmanın önsözünü INETA Türkiye başkanı, MVP ve RD olan Daron Yöndem yazmıştır. Kendisine burada teşekkür ediyoruz.

 

Türkçe içerikli kod standartlarını indirmek için: TiKS_VB v1.0.pdf (1,70 mb)

Orjinal link: http://www.mediafire.com/?r90segid28a328b

Proje Ekibimiz:

Proje Koordinatörü
Kadir Çamoğlu

Editör
Volkan Atasever

Kapak Tasarımı
Hakan Çamoğlu

Yazarlar
Volkan Atasever
Merve Ceylan
Kadir Çamoğlu
Burhan Çetinkaya
Bahtiyar Dilek
İrfan Mevsim
Can Yapan
Hakan Yavuz
Yücel Yıldırım

 



VB.NET ile PDF Yaratma ve İşleme

clock Şubat 20, 2007 07:59 by author Volkan Atasever

VB.NET ile 3. Parti yazılımlar kullanarak PDF yaratma, işleme ve çeşitli özelliklerle PDF dosyaları üzerinde yapılan işlemleri örnek kodlar eşliğinde anlatmaya çalışıyoruz.
---------------------------------------------------------------------------------------------------

Makalemde, sizlere VB.NET ile PDF yaratma ve PDF işleme ile ilgili bilgiler sunacağım. Projemize 3. Parti bir DLL ekleme zorunluluğumuz var bu dll’i http://www.tallcomponents.com/default.aspx?id=tallpdf3-download adresinden de çekebilirsiniz. Piyasada sınırsız bu işi yapan DLL ler varken bu firmanın dll’ini seçmemdeki amaç tamamen sınırsız kullanıma açık olmasıdır. Belli bir zaman kısıtlaması olmamasına rağmen deneme sürümü olduğunu uygulamamızda belirtiyor.

         Buna ek olarak tamamen ücretsiz zLib’i de önerebilirim bu dll ise tamamen ücretsiz TallComponents’e göre doküman eksikliği biraz var ama source’ları açık olduğu için istediğiniz atraksiyonu yapabilirsiniz. zLib içinde

http://www.componentace.com/zlib_.NET.htm adresini kullanabilirsiniz. Bu makalemde zLib örneklerine değinmeyeceğim.

Projemize referans olarak:

TallComponents.PDF.Layout.DLL dosyasını eklemeniz gerekli.

Ardından çeşitli atraksiyonları PDF üzerinde gerçekleştirebiliriz.

Bir PDF dosyası yaratmak için aşağıdaki kodu kullanabilirsiniz:



Imports System
Imports System.IO
Imports TallComponents.PDF.Layout
Imports TallComponents.PDF.Layout.Paragraphs
Namespace TallComponents.Samples.TallPDF

Public Class HelloWorld

Shared Sub Main()
  ' Using
   Dim file As FileStream = New FileStream("..\..\HelloWorld.pdf", FileMode.Create, FileAccess.Write)
   Try
                    Dim document As Document = New Document
                    Dim section As Section = document.Sections.Add
                    Dim textParagraph As TextParagraph = New TextParagraph
                    section.Paragraphs.Add(textParagraph)
                   Dim fragment As Fragment = New Fragment
                    fragment.Text = "Hello world!"
                    textParagraph.Fragments.Add(fragment)
                   document.Write(file)
       Finally
                  CType(file, IDisposable).Dispose()
       End Try
End Sub
End Class
End Namespace

Hazır bulunan bir text dosyası veya text üzerinde biçimsel işlemler yaparak PDF olarak kaydetmek çok basit metodlarla mümkün kodun açıklaması kodun içinde yapılmıştır.



Imports System
Imports System.IO
Imports TallComponents.PDF.Layout
Imports TallComponents.PDF.Layout.Paragraphs
Namespace TallComponents.Samples.TallPDF

Public Class TextFormatting
                Const text As String = "With TallPDF.NET you can create PDF documents " + "by building an instance of the TallPDF.NET Document " + "Object Model. The TallComponents team has produced " + "a DOM that is extremely intuitive and yet powerful. " + "This allows you to create both simple and complex " + "documents fast."

Shared Sub Main()
                ' Using
                 Dim file As FileStream = New FileStream("..\..\TextFormatting.pdf", FileMode.Create, FileAccess.Write)
                           Try
                                 Dim document As Document = New Document
                                 Dim section As Section = document.Sections.Add
                                 section.PageSize = PageSize.A4
                                 Dim textParagraph As TextParagraph 
                                 section.Paragraphs.Add(CreateTextParagraph("TextParagraph with default properties:")) 
                                 section.Paragraphs.Add(CreateTextParagraph(text, System.Drawing.Color.Blue))
                                 section.Paragraphs.Add(CreateTextParagraph("textParagraph.HorizontalAlignment = HorizontalAlignment.Right"))
                                textParagraph = CreateTextParagraph(text, System.Drawing.Color.Blue)
                                textParagraph.HorizontalAlignment = HorizontalAlignment.Right
                                section.Paragraphs.Add(textParagraph)
                                section.Paragraphs.Add(CreateTextParagraph("textParagraph.HorizontalAlignment = HorizontalAlignment.Center"))
                                textParagraph = CreateTextParagraph(text, System.Drawing.Color.Blue)
                                textParagraph.HorizontalAlignment = HorizontalAlignment.Center
                                section.Paragraphs.Add(textParagraph)
                                section.Paragraphs.Add(CreateTextParagraph("textParagraph.Justified = true"))
                                textParagraph = CreateTextParagraph(text, System.Drawing.Color.Blue)
                                textParagraph.Justified = True
                                section.Paragraphs.Add(textParagraph)
                                section.Paragraphs.Add(CreateTextParagraph("textParagraph.LineSpacing = 5"))
                                textParagraph = CreateTextParagraph(text, System.Drawing.Color.Blue) 
                                textParagraph.LineSpacing = 5 
                                section.Paragraphs.Add(textParagraph)
                                section.Paragraphs.Add(CreateTextParagraph("textParagraph.FirstLineIndentation = 20"))
                                textParagraph = CreateTextParagraph(text, System.Drawing.Color.Blue)
                                textParagraph.FirstLineIndentation = 20
                                section.Paragraphs.Add(textParagraph)
                                section.Paragraphs.Add(CreateTextParagraph("textParagraph.HangIndentation = 20")) 
                                textParagraph = CreateTextParagraph(text, System.Drawing.Color.Blue)
                                textParagraph.HangIndentation = 20
                                section.Paragraphs.Add(textParagraph)
                                document.Write(file)
                     Finally
                                CType(file, IDisposable).Dispose()
                     End Try
End Sub

Private Shared Function CreateTextParagraph(ByVal text As String) As TextParagraph
                      Return CreateTextParagraph(text, System.Drawing.Color.Black)
End Function

Private Shared Function CreateTextParagraph(ByVal text As String, ByVal textcolor As System.Drawing.Color) As TextParagraph
                            Dim paragraph As TextParagraph = New TextParagraph
                            Dim textFragment As Fragment = New Fragment(text)
                            textFragment.TextColor = textcolor
                            paragraph.Fragments.Add(textFragment)
                            paragraph.SpacingAfter = 10
                            Return paragraph
End Function
End Class
End Namespace


Aynı zamanda XML dosyalarınıda PDF formatına çevirebiliyoruz.
Örnek XML:
'<'document author="Volkan"'>'
'<'section pagesize="Letter"'>'
'<'!-- İçerik... --'>'
'<'/section'>'
'<'/document'>'

XML dosyamızı PDF çeviren kod bloğu,

Dim xml As XmlDocument = New XmlDocument
xml.Load("topdf.xml")
Dim document As Document = New Document
document.Read(xml.DocumentElement)
Dim file As FileStream = New FileStream("out.pdf", FileMode.Create)
document.Write(file)

Burada sayamayacağımız kadar çeşitli örneklerle kütüphane kullanımımızı ve yapacaklarımızı genişletebiliriz. Makalemin başında verdiğim linkten çektiğiniz zLib ile ilgili bir örnek yapmanın önemliliğini vurgulamak isterim her componenet değişik arayüzlerle gelmekte. Yine zLib’i referans olarak eklememiz gerekiyor.

Volkan Atasever



Multithreading Programlama

clock Aralık 6, 2006 07:52 by author Volkan Atasever

       Multithreading programlamaya ve kodlara girmeden önce bu makalemde multitasking ve multithreading’in ne anlama geldiğini ve prensiplerini anlatmaya çalışacağım.
         PC’ler ilk çıktığında multitasking işletim sistemlerine sahip değildiler. Bu bir programı çalıştırmak için ilk önce çalışan programı kapatıp, çalıştırmak istediğiniz programı açmak anlamına geliyordu. Zaman kaybı olduğu gibi verimde de büyük düşüşler yaşanıyordu.
         Multitasking Türkçe ifadesiyle çok işlemli anlamına gelmektedir. İşlemler zamanı paylaşır ve bir işlemin bittiği yerde diğeri başlar bunun için 20ms gibi bir süreçte bu işler olur. Diğer işlemde 20ms çalışır ve tekrar yine diğer işleme geçilir. Win32 sistemlerde 20ms belirlenmiştir bu süre quanta süresi olarak adlandırılmıştır. Bu çok işlemli sisteme(Multi Processing) Multitasking sistemler denir.
         Bizim inceleceğimiz konu ise bir işlemdeki parçacıklardır.Burada da aynı işlemlerin zaman paylaşımında olduğu gibi işlemdeki parçacıklar kendi aralarında bir zaman paylaşımı oluştururlar.
         Multi Thread sayesinde aynı anda bir uygulamada birden fazla işlem yapabilmekteyiz. Multi Processing’in, process seviyesine indirilmiş bir özeliği gibi düşünebilirsiniz. Böylece uygulamalarımız daha stabil, kararlı ve bazı durumlarda performans da artış da getirmektedir.
         VB.NET ile multi thread yapmamız için bize gereken sadece System.Threading namespace’idir.

         Dim parcacik as Thread
         parcacik = new Thread(new ThreadStart(AddressOf fonksiyon))

         Thread sınıfından parcacik isimli bir nesne oluştuyor ardından bir alt satırda ThreadStart isminde delegate türünden nesnemizi parametre olarak veriyoruz. Bu delegeyede parametre olarak fonksiyon isimli fonksiyonumuzun başlangıç adresini gönderiyoruz.
         Kanalımızı çalıştırmak için ise;
         Dim instance As Thread
         instance.Start()
         Start metodunu kullanmalıyız.
         Çalışan kanalı sonlandırmak için;

         Dim instance As Thread
         instance.Abort()
         Abort Metodunu kullanmalıyız.
         Diğer önemli metodlar ise Suspend() , Resume() ve Sleep() metodlarıdır.
         Public Sub Suspend()
         Public Sub Resume()
         Sleep metodu ise kanalımızı belirlenen süre içerisinde çalışmasını yarıda keser.Metod, integer tipinde parametre alır ve bu tamsayıyı milisaniye cinsinden değerlendirir.

         Public Shared Sub Sleep ( _
                   millisecondsTimeout As Integer _
         )

         Bazı önemli özellikler ise şunlardır:

         IsAlive:
         Dim instance As Thread
         Dim value As Boolean
         value = instance.IsAlive

         IsBackGround:
         Dim instance As Thread
         Dim value As Boolean
         value = instance.IsBackground
         instance.IsBackground = value

         IsAlive propertys’i üzerinde çalıştırılan kanal halen çalışıyorsa true değerini aksi halde false değerini döndürür bu da bize avantajlar sağlamaktadır.
         IsBackGround özelliği ise kanalın arka planda çalışmasını gerçekleştirir kanalın arkaplanda çalışmasını istiyorsanız IsBackground’a true değerini atamalısınız.
         Her uygulamada varsayılan olarak bir thread ile çalışır ve zaten programımızın çalışmasını sağlayan bu ana thread’dir. Bu thread’e ulaşmak içinde CurrentThread özelliğini kullanabiliriz.
         Deklarasyonu aşağıdaki gibidir:
         Public Shared ReadOnly Property CurrentThread As Thread
         Teorik olarak öğrendiğimiz multithreading programlamayı basit bir örnekle irdeleyelim;

Imports System.Threading

Public Class Form1
          Dim thr As Thread
          Private Sub arkaplan()
                   Dim i As Integer = 1

                   Do While True
                            ListBox1.Items.Add("Tekrarlama: " + i.ToString())
                            i += 1
                   Loop
          End Sub

          Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
                   thr = New Thread(AddressOf Me.arkaplan)
                   thr.Start()
          End Sub

          Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
                   thr.Abort()
          End Sub

          Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button3.Click
                   thr.Sleep(2000)
          End Sub
End Class

         Bu örneğimizdede göreceğiniz gibi thr isimli thread’imizi buton 1’e basmamızla birlikte canlandırıyoruz ve thread’i başlatıyoruz. İkinci butona basmamızla thread sonlanmış oluyor.
         Kanallardan bahsederken unutmamız gereken kanalların önceliğidir. Bir kanalın önceliğini CPU belirler. Düşük öncelikli kanallar az CPU zamanı, yüksek öncelikli kanallar ise daha fazla CPU zamanı gerektirirler. Kullandığımız kanallar varsayılan bir öncelik atarlar. Tabiki bu önceliği bizim atamamızda mümkün ve böylece daha fazla performans elde edebiliriz. Bunun içinde Thread sınıfının üyesi olan priority özelliğini kullanabiliriz.
         Public Property Priority As ThreadPriority
         5 adet öncelik ataması mevcuttur. Bunlar sırasıyla;

         Highest
         AboveNormal
         Normal
         BelowNormal
         Lowest
         Oluşturduğumuz kanala biz bir öncelik atamassak varsayılan olarak Normal atanacaktır. Öncelik ataması ile ilgili açıkca önceliklerin ve CPU zamanını test eden bir örnek yapalım ve bu zamanlamayı görelim.
         Konsoldan çalışan örneğimiz:

Imports System
Imports System.Threading

Module Module1
          Sub Main()
                   Dim priorityTest As New PriorityTest()

                   Dim threadOne As Thread = _
                   New Thread(AddressOf priorityTest.ThreadMethod)
                   threadOne.Name = "ThreadOne"
                   Dim threadTwo As Thread = _
                   New Thread(AddressOf priorityTest.ThreadMethod)
                   threadTwo.Name = "ThreadTwo"
                   threadTwo.Priority = ThreadPriority.BelowNormal
                   threadOne.Start()
                   threadTwo.Start()

                   ' 10 Saniye
                   Thread.Sleep(10000)
                   priorityTest.LoopSwitch = False
          End Sub
End Module


Public Class PriorityTest
          Dim loopSwitchValue As Boolean
          Sub New()
                   loopSwitchValue = True
          End Sub
          WriteOnly Property LoopSwitch() As Boolean
          Set(ByVal value As Boolean)
          loopSwitchValue = value
          End Set
          End Property
          Sub ThreadMethod()
                   Dim threadCount As Long = 0
                   While loopSwitchValue
                            threadCount += 1
End While                   
                   Console.WriteLine("{0} with {1,11} priority " & _
                   "has a count = {2,13}", Thread.CurrentThread.Name, _
                   Thread.CurrentThread.Priority.ToString(), _
                   threadCount.ToString("N0"))
          End Sub

End Class


         Çıktı: 

  Multithreading programlamayı anlatırken Thread’lerin çalışma mantığı içerisindeki bazı çelişkileri engellemek için senkronizasyon sağlamak için bazı yöntemlere başvurmamız gerekmektedir. Aksi halde programımız istenmeyen sonuçlar doğuracaktır. Senkronizasyonu kullanma nedenimiz çoğunlukla aynı veriye erişimin söz konusu olduğu durumlarda meydana gelebilecek karışıklıkdır. Eğer ben integer bir değere bir thread’de 5 atayıp diğer thread’de aynı anda 7 atıyorsam ve ilk thread’de atadığım 5 sayısına göre işlem yapmam gerekirken 7 değerine göre işlem yapıyorsam ortada bir karışıklık olacaktır.
         Synclock ifadesi bu senkronizasyonu sağlayan kurallardan bir tanesidir.
         Synclock(“locking”)
                   ‘Kodlar
         End Synclock

         Monitor sınıfıda senkronizasyonu sağlamanın yollarından bir tanesidir. 11 adet metoda sahiptir. Bunlardan ikisi en önemlileridir. Bunlar Enter() ve Exit metodlarıdır.
         Dim obj As Object
         Monitor.Enter(obj)
         Ve
         Dim obj As Object
         Monitor.Exit(obj)
          Monitor sınıfı, Synclock ile aynı işi yapmaktadır.Microsoft bir Synclock bloğunun monitor sınıfı ile ilk önce Enter() metodunu ardından Exit() metodunu çağırmanın eşdeğer olduğunu bildirmiştir.
          Bu iki yöntem ile küçük bir uygulama yapacak olursak;
         Synclock Örneğimiz:

Imports System.Threading
Public Class Form1
          Public Sub fonk()
                   Dim i As Integer

                   SyncLock ("locking")
                            For i = 1 To 10
                            ListBox1.Items.Add("Sayı: " + i.ToString())
                            Next
                   End SyncLock

          End Sub
          Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
                   Dim thr1 As New Thread(AddressOf Me.fonk)
                   Dim thr2 As New Thread(AddressOf Me.fonk)
                   Dim thr3 As New Thread(AddressOf Me.fonk)
                   thr1.Start()
                   thr2.Start()
                   thr3.Start()
          End Sub
End Class

         Monitor Sınıfı Örneğimiz:
Imports System.Threading
Public Class Form1
          Public Sub fonk()
                   Dim i As Integer

                   Monitor.Enter(Me)
                   For i = 1 To 10
                   ListBox1.Items.Add("Sayı: " + i.ToString())
                   Next
                   Monitor.Exit(Me)

          End Sub

          Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
                   Dim thr1 As New Thread(AddressOf Me.fonk)
                   Dim thr2 As New Thread(AddressOf Me.fonk)
                   Dim thr3 As New Thread(AddressOf Me.fonk)
                   thr1.Start()
                   thr2.Start()
                   thr3.Start()
          End Sub
End Class

         Gördüğünüz gibi kodumuzda fazla bir değişiklik olmadı. Sadece Synclock bloğunun yerine Monitor.Enter(object) ve Monitor.Exit(object) metodlarının geldiğine dikkat edin.
          Çok kanallı programlama yapabildiğimiz gibi makalemizin başındada belirttiğim gibi çok işlemli programlama da yapabilirsiniz. Bunun için tek gerekli olan Process sınıfını kullanmak oalcaktır. Bir işlemi başlatmak için Start() metodunu kullanmamız yeterli olacaktır.
         Process başlatmak için:
          Dim prsc As New Process
          prsc.Start(“wordpad.exe”)

         Process sınıfı ile ilgili bir örenk yapmak gerekirse:
          Dim prsc As New Process
          prsc.Start(“wordpad.exe”)
         prsc.WaitForExit()
         prsc.Close()
         Bu kod bloğunu projenizde çalıştırdığınız zaman wordpad başlayacaktır. Siz wordpad’i kapatana kadar programınız beklemede kalacaktır. Siz programı kapattığınız zaman Close() metodu ile ilgili işleme ayrılan bellek serbest bırakılacaktır.
          Sorularınızı,yorumlarınızı ve görüşlerinizi volkan@volkanatasever.com adresine mail olarak atabilirsiniz.



VB.NET ile Ses İşlemleri

clock Kasım 17, 2006 07:55 by author Volkan Atasever

  VB.NET’in biz programcılar için yapabilecekleri gerçekten neredeyse sınırsıza yakın. .NET ortamını, Visual Basic’in kolaylığıyla ve .NET’in kompleks içeriğiyle birleştirdiğimiz zaman inanılmaz özelliklere imza atan bir ortam görüyoruz.
        Programlarımızı zenginleştirmek için görsel öğeleri bolca kullanmaktayız. Ses unsuru da unutulmaması gereken başlıca özelliklerden. Ses bildiğimiz gibi kulağımıza gelen ve beynimizin uyarılmasını sağlayan dış unsurlarla duyumsamamızı etkileyen bir titreşim topluluğudur.
        Biz ise sıradan ses den değil ses sinyallerinden bahsedeceğiz İngilizce terimi ile ifade edersek: “audio”.
        Fazla derinlemesine girmeden standart ve standart dışı olarak VB.NET projelerimizde bu sesi nasıl kullanabileceğimizi örneklendireceğiz. Gerek Directx Sound gerekse apilerle veya directx audioplayback ile bunları nasıl elde edeceğimizi inceleyeceğiz.
        Bir oyun yazıyorsanız sizin için çok yararlı olacaktır veya kullanıcı ile etkileşime giren bir program.
        Başlangıç olarak makalemin teknik kısmına directx sound ile başlamak istiyorum. Başlamadan önce directx sdk nın bilgisayarınıza yüklü olduğuna emin olmalısınız ben şubat 2006 dağıtımını kullandım.

        http://www.microsoft.com/windows/directx/default.mspx
        Yukarıdaki bağlantının download kısmında sdk yı indirebilirsiniz.
        Projenize ileriki adımlarda da kullanmak için bazı referanslar eklemek zorundayız. Aşağıdaki resimde görebilirsiniz. 

Projemize sağ tıklayıp add reference kısmına basıyoruz.
        Ardından; 

Microsoft.DirectX.DirectSound , Microsoft.DirectX.AudioVideoPlayBack ve Microsoft.DirectX referanslarını projenize ekleyin.
        Not: Burada projenin bütün kodlarını değil de can alıcı noktalarını açıklayacağım. Uygulamanın tam kodlarını örnek kodlar bölümünden indirebilirsiniz.

        Imports Microsoft.DirectX.DirectSound
        Imports Microsoft.DirectX
        ile namespacelerimizi projemize dahil ediyoruz.
        İlk başta bize gereken bilgisayarımızdaki herhangi bir yoldan ses dosyamızı çağırmaktır. Bunun için bir textbox ve bir browse butonuna ihtiyacımız var. Textbox bileşenimizde de ses dosyamızın yolunu görebileceğiz bunun için gerekli olan toolbox’ımızdan OpenFileDİalog isimli bileşinimizi projememize eklememizdir. 

OpenFileDialog1.ShowDialog()
         filename = OpenFileDialog1.FileName
         TextBox1.Text = filename

        Filename ise bir string olarak tanımlanmıştır.
        Temel kodumuz ise aşağıdaki gibidir:


                  Dim dev As New Device()
                  dev.SetCooperativeLevel(Me, CooperativeLevel.Normal)
                  Dim dsc As New BufferDescription()
                  dsc.ControlVolume = True
                  dsc.ControlFrequency = True
                  Dim snd As New SecondaryBuffer(filenamedxsound, dev)
                  snd.Volume = volume
                  snd.Frequency = frekans
                  snd.Play(0, BufferPlayFlags.Default)

          Device nesnemizi ses kartınız olarak düşenebilirsiniz sesimizi çalmamız için gereken en temel bileşendir. Yani ilk önce ses aygıtımızı oluşturduk. Ardından aygıtımızın üzerinden setcooperativelevel’i çağırmamız gerekir. Burada Normal’i kullandık çoğunluklada bu seçenek yeterli olacaktır. Ayrıca bir BufferDescription nesnesini canlandırdık bunun sebebi bu nesne üzerinde dahil olan ses yüksekliğini ve ses frekansının değerlerini aktif hale getirmek için kullanılmıştır. Ardından SecondaryBuffer’ımızı oluşturup filenamdxsound adını verdiğimiz dosya ismimizi çağırıyor ve ikinci parametre olarakda aygıtımızız gösteriyoruz. Snd.Volume e ses yüksekliği değerimizi Frequency’e ise bizim seçtiğimiz frekansı aktarıp . snd.Play’e 0 değerini veriyoruz ve varsayılan değer olarak çalmasını yani bir kere çalıp durmasını söylüyoruz.
          Örnek uygulamamızda kullandığımız gibi bir trackbar kullanmak isterseniz maximum ve minimum değerlerini doğru seçmeniz gerekecektir. Bunun içinde volume trackbar’ımızın maximumunu 0 ve minimumunu ise -3000 olarak ayarlamalısınız.
          Frekans’ımızın minimumumu ise 100 maksimumuda 10000’dir.
          Sesi ve frekansı trackbarla ayarlamamıza yarayacak örnek kodumuz:
           If TrackBar1.Value = TrackBar1.Minimum Then
                      volume = -3000
           Else
                     volume = TrackBar1.Value
           End If
           If TrackBar2.Value = TrackBar2.Minimum Then
                      frekans = 100
           Else
                      frekans = TrackBar2.Value
           End If
          Directx sound ile ses çaldırırken daha bir çok özellik yer almaktadır. Bunlardan bazıları,
          Sağ ve sol balansı kontrol etmek için gereken özellik:
          Yukarıdaki kodumuzda aşağıdaki modifikasyonları yapabilirsiniz.
                     Dim dev As New Device()
                      dev.SetCooperativeLevel(Me, CooperativeLevel.Normal)
                     Dim dsc As New BufferDescription()
                     dsc.ControlVolume = True
                      dsc.ControlPan = True
                     Dim snd As New SecondaryBuffer(filenamedxsound, dev)
                     snd.Volume = volume
                      snd.Pan = 3000
                     snd.Play(0, BufferPlayFlags.Default)

          Speaker seçiminide kolay bir şekilde projenize ekelmeniz olası:
          ‘ Yeni Speaker Nesnesi yarat
          Dim spk As New Speakers();

          ‘ Properties’ler
          spk.Mono = false ‘ mono speaker
          spk.Headphone = false ‘ headphones
          spk.Stereo = false ‘ stereo speakers
          spk.Quad = true ‘ quad system (iki ön, iki arka)
          spk.FiveDotOne = false ‘ 5.1 surround system
          spk.SevenDotOne = false ‘ 7.1 surround system
          spk.Surround = false ‘ surround system
          dev.SpeakerConfig = spk;

          Directx.AudioVideoPlayback ile ses çaldırmak ise Directxsound’dan daha kolay ve birkaç kod satırı ile sesi çaldırabiliyoruz.
          Bunun içinde
          Imports Microsoft.DirectX.AudioVideoPlayback
          Namespace’imizi import etmemiz gerekecek.
          Kodumuz ise:
                     Dim audio As New Audio(filenameaudiopb)
                     audio.Volume = volume
                     audio.Play()

                    Burada filenameaudiopb ses dosyamızın ismi ve Audio nesnemizde ses dosyasını çalmamızı yarayan nesnemiz. audio.Volume ve audio.Play() ile default olarak sesimizi çaldırabiliriz.
          Ses dosyalarını çaldırmak için diğer bir yöntemimiz ise DLL import ile API’ler kullanılarak eskiden kalma yöntemlerle oluşturacağımız bir sistemdir.
                    Imports System.Runtime.InteropServices
          Projemize yukarıdaki namespace’i ekleyelim.
          Ardından;
                      Declare Auto Function PlaySound Lib "winmm.dll" (ByVal name _
                     As String, ByVal hmod As Integer, ByVal flags As Integer) As Integer
                      Public Const SND_SYNC = &H0 ' Senkron
                      Public Const SND_ASYNC = &H1 ' Asenkron
                     Public Const SND_FILENAME = &H20000

          ile DLL dosyamızı import edelim ve sabitlerimizi belirleyelim SND_SYNC müzik dosyamızı Senkron bir şekilde çalmamızı SND_ASYNC ise asenkron şekilde çalmamızı gerçekleyecektir. SND_FILENAME ise adından anlayacağınız gibi dosyamızın ismi.
          Tanımlamalarımız biraz karmaşık olmasına rağmen çalma işlemimiz çok daha basittir. Bunun için yapacağınız tek şey PlaySound metodunu kullanmanız olacaktır.
          PlaySound(filename,0,SND_FILENAME)
          Senkron veya asenkron çaldırmak için ise
          PlaySound(filename,0,SND_FILENAME or SND_SYNC)
          Veya
          PlaySound(filename,0,SND_FILENAME or SND_ASYNC)
          Şeklinde kodumuza ekleme yapabiliriz.
          Diğer sabitlerimiz ise aşağıdaki gibidir:
                     Public Const SND_SYNC = &H0
                     Public Const SND_ASYNC = &H1
                     Public Const SND_MEMORY = &H4
                     Public Const SND_ALIAS = &H10000
                     Public Const SND_NODEFAULT = &H2
                     Public Const SND_FILENAME = &H20000
                     Public Const SND_RESOURCE = &H40004
           Not: Directx Sound ve API’lerle wav dosyalarını çalıp üstünde işlem yapabilirken Directx audio playback ile mp3 dosyalarını da çaldırabilirsiniz.



Volkan Atasever Kimdir ?

E-Mail: volkan(et)volkanatasever.com

Genel Müdür/S4G 
Bilgisayar Mühendisi

mühendislik, edebiyat, retro computer, yazılım, şiir, nümismatik, bilişim, podcast ve bir çok kategoride yazılarım...

Yazılım Kitaplarım

   

Şiir Kitaplarım

Ulusal Yayınlar ve Programlar

 

Sosyal Ağlarım

 

 

 

 

Retro Bilgisayar Dergimiz

Türkçe Retro Bilgisayar dergimiz haziran 2016'da ilk sayısını çıkardı. ilk sayı yeni bir internet sitesinden tekrar yayınlanacaktır. Retro camiası tüm dünyada oldukça eğlenceli bir camia. Sizde katkıda bulunmak isterseniz bana mail atmanız yeterli. Dergimiz PDF formatında ve tamamen ücretsizdir.

Yasal Bilgi

Sitedeki yazıları,kodlar ve diğer materyaller Volkan Atasever'e aittir. Yazarı ve siteyi kaynak göstererek yazıları paylaşabilirsiniz.  Copyright(c)2004-2017

Sign In

Yazılım