Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
KANSoftWare

Новый релиз SidPlayer: улучшенные функции и исправления ошибок

Delphi , Мультимедиа , Запись звука

 

В последние несколько месяцев разработчик Gigatron активно работал над улучшением SidPlayer, который предназначен для воспроизведения музыки, записанной в формате SID, используемом на Commodore 64. Недавний релиз включает в себя несколько новых функций и исправлений ошибок, что делает SidPlayer более надежным и функциональным. В этой статье мы рассмотрим основные изменения, сделанные в новом релизе, а также рассмотрим, как можно улучшить и расширить функциональность SidPlayer с использованием языка программирования Object Pascal (Delphi).

Основные изменения в новом релизе

Поддержка новых форматов файлов SID

В новом релизе SidPlayer поддерживает несколько новых форматов файлов SID, включая .rsid, .mus и .psid. Это значительно расширяет возможности программы, позволяя воспроизводить музыку, записанную в различных форматах. Теперь пользователи могут наслаждаться SID-музыкой, не беспокоясь о том, какой формат файла они используют.

Улучшенная точность воспроизведения

Разработчики SidPlayer улучшили точность воспроизведения музыки в формате SID. Это достигнуто за счет использования более точных алгоритмов воспроизведения и улучшения библиотеки SID. Теперь SidPlayer может воспроизводить SID-музыку с высокой точностью, сохраняя оригинальное звучание.

Упрощение настройки

В новом релизе SidPlayer упрощена настройка библиотеки SID. Теперь пользователи могут настроить SID-модель, выбор модели C64 и другие параметры без необходимости загружать ROM-файлы C64. Все необходимые ROM-файлы уже включены в библиотеку SidPlayer.

Поддержка многоканального вывода

Новый релиз SidPlayer поддерживает многоканальный вывод звука, что позволяет воспроизводить SID-музыку в стерео или моно режиме. Это улучшает качество звука и делает SidPlayer более гибким.

Исправление ошибок

В новом релизе SidPlayer были исправлены несколько ошибок, которые приводили к некорректному воспроизведению музыки. Теперь SidPlayer работает стабильно и корректно воспроизводит SID-музыку, даже если она содержит сложные элементы.

Пример кода на Object Pascal (Delphi)

Для демонстрации работы SidPlayer на Object Pascal (Delphi), давайте рассмотрим пример кода, который демонстрирует основные функции SidPlayer.

Загрузка и воспроизведение SID-файла

Вот пример кода, который загружает SID-файл и начинает его воспроизведение:

unit Unit1;

{$mode objfpc}{$H+}

interface

uses
  Classes, SysUtils, Forms, Controls, Graphics, Dialogs, ExtCtrls, sid_lib,
  mmsystem, windows;

const
  Channels = 1;
  BitsPerSample = 16;
  SampleRate = 44100; // Nombre d'échantillons par seconde
  BufSize = 8192*2;    // Taille du tampon audio x 2
  BufferCount = 4;

type
  { TForm1 }
  TForm1 = class(TForm)
    Timer1: TTimer;
    procedure FormCreate(Sender: TObject);
    procedure FormShow(Sender: TObject);
    procedure Timer1Timer(Sender: TObject);
  private
    buffers: array[0..BufferCount-1] of array[0..BufSize-1] of SmallInt;
    waveHeaders: array[0..BufferCount-1] of TWaveHdr;
    currentBuffer: Integer;
  public
  end;

var
  Form1: TForm1;
  waveOut: HWAVEOUT;
  sid_mus: Pointer;
  ok_flag: Boolean = false;
  fsize: integer;

implementation

{$R *.lfm}

procedure HandleError(const Str: PAnsiChar);
begin
  if Str <> nil then
  begin
    ShowMessage('Error: ' + Str);
    Halt(1);
  end;
end;

procedure FillBuffer(bufferIndex: Integer);
var
  GenSmp, NumSmp, sid_sng: Integer;
begin
  if ok_flag then
  begin
    bufferIndex := Form1.currentBuffer;
    NumSmp := BufSize div (Channels * (BitsPerSample div 8));
    GenSmp := sid_play(@Form1.buffers[bufferIndex][0], NumSmp);
  end;
end;

function WaveOutCallback(hwo: HWAVEOUT; uMsg: UINT; dwInstance, dwParam1, dwParam2: DWORD_PTR): DWORD; stdcall;
begin
  if uMsg = WOM_DONE then
  begin
    FillBuffer(Form1.currentBuffer);
    waveOutWrite(waveOut, @Form1.waveHeaders[Form1.currentBuffer], SizeOf(TWaveHdr));
    Form1.currentBuffer := (Form1.currentBuffer + 1) mod BufferCount;
  end;
  Result := 0;
end;

procedure InitAudio;
var
  wFormat: TWaveFormatEx;
  i: Integer;
begin
  SetThreadPriority(GetCurrentThread, THREAD_PRIORITY_LOWEST);
  with wFormat do
  begin
    wFormatTag := WAVE_FORMAT_PCM;
    nChannels := Channels;
    nSamplesPerSec := SampleRate;
    wBitsPerSample := BitsPerSample;
    nBlockAlign := (wBitsPerSample * nChannels) div 8;
    nAvgBytesPerSec := nSamplesPerSec * nBlockAlign;
    cbSize := 0;
  end;
  if waveOutOpen(@waveOut, WAVE_MAPPER, @wFormat, QWORD(@WaveOutCallback), 0, CALLBACK_FUNCTION) <> MMSYSERR_NOERROR then
    raise Exception.Create('Erreur lors de l''ouverture du périphérique audio');
  // Préparation des tampons
  for i := 0 to BufferCount - 1 do
  begin
    ZeroMemory(@Form1.waveHeaders[i], SizeOf(TWaveHdr));
    with Form1.waveHeaders[i] do
    begin
      lpData := @Form1.buffers[i][0];
      dwBufferLength := BufSize;
      dwFlags := 0;
      FillBuffer(i);
    end;
    waveOutPrepareHeader(waveOut, @Form1.waveHeaders[i], SizeOf(TWaveHdr));
  end;
  Form1.currentBuffer := 0;
  for i := 0 to BufferCount - 1 do
  begin
    FillBuffer(i);
    waveOutWrite(waveOut, @Form1.waveHeaders[i], SizeOf(TWaveHdr));
  end;
end;

procedure LoadBinaryFileToBuffer(const FileName: string; var Buffer: TBytes);
var
  MemoryStream: TMemoryStream;
begin
  MemoryStream := TMemoryStream.Create;
  try
    MemoryStream.LoadFromFile(FileName);
    SetLength(Buffer, MemoryStream.Size);   //taille du buffer
    MemoryStream.ReadBuffer(Buffer[0], MemoryStream.Size);
    fsize := MemoryStream.Size;
  finally
    MemoryStream.Free;
  end;
end;

procedure TForm1.FormCreate(Sender: TObject);
var
  Sid_buff: array of Byte;
  sid_cr: Pointer;
  sid_ld: Boolean;
  sid_cfg: Boolean;
  sid_sng: integer;
  song_state: Boolean;
begin
  try
    LoadBinaryFileToBuffer('gyruss.sid', Sid_buff);   // buffer load
  except
    on E: Exception do
      ShowMessage('Erreur : ' );
  end;
  sid_cr := sid_Create;
  sid_cfg := sid_Config();
  sid_ld := sid_load(PChar(sid_Buff), fsize, 5); // sid_buffer,file size, song= num;
end;

procedure TForm1.FormShow(Sender: TObject);
begin
  InitAudio;
  ok_flag := true;
end;

procedure TForm1.Timer1Timer(Sender: TObject);
begin
end;

end.

Поддержка многоканального вывода

Для поддержки многоканального вывода можно изменить константы Channels, BitsPerSample и BufSize в соответствии с вашими потребностями. Например, для стерео вывода можно установить Channels := 2.

Управление воспроизведением

Для управления воспроизведением можно использовать функции библиотеки SidPlayer, такие как sid_play, sid_stop, sid_Select_Song и другие. Например, для остановки воспроизведения можно использовать следующий код:

procedure TForm1.ButtonStopClick(Sender: TObject);
begin
  sid_stop();
  ok_flag := false;
end;

Заключение

Новый релиз SidPlayer включает в себя множество улучшений и исправлений ошибок, что делает его более надежным и функциональным. С использованием языка программирования Object Pascal (Delphi) можно легко интегрировать SidPlayer в свои проекты и расширить его функциональность. Мы надеемся, что эта статья поможет вам.

Создано по материалам из источника по ссылке.

Контекст описывает обновления и улучшения в программе SidPlayer, предназначенной для воспроизведения музыки в формате SID, включая поддержку новых форматов файлов, улучшенную точность воспроизведения и упрощённую настройку, а также демонстрирует примеры


Комментарии и вопросы

Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.


:: Главная :: Запись звука ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-12-22 20:14:06
2025-02-22 11:38:06/0.012030124664307/0