Извините, ничего не найдено.

Не расстраивайся! Лучше выпей чайку!
Регистрация
Справка
Календарь

Вернуться   forum.boolean.name > Программирование игр для компьютеров > С#

С# Средство разработки на платформе .Net

Ответ
 
Опции темы
Старый 06.01.2014, 00:27   #1
RegIon
Элита
 
Аватар для RegIon
 
Регистрация: 16.01.2010
Адрес: Новосибирск
Сообщений: 2,157
Написано 502 полезных сообщений
(для 1,012 пользователей)
Bass.dll перехват потока

Кароче, решил сделать вот:



что бы потолок под музыку "плясал".
Это дело управляется микроконтроллером, а данные о музычке передаются с компа.
1-Как мне спомощью bass.dll сделать спектрограмму выходного потока аудиокарты?
2-как в gtk#2 сделать что-то типо таймера, как в формах?

Нарыл исходник онного на Делфи

unit Unit1;

interface

uses
  Windows
MessagesSysUtilsVariantsClassesGraphicsControlsForms,
  
DialogsStdCtrlsbassExtCtrlsmmsystem;

type
  TForm1 
= class(TForm)
    
ComboBox1TComboBox;
    
Label1TLabel;
    
Timer1TTimer;
    
PaintBox1TPaintBox;
    
procedure FormCreate(SenderTObject);
    
procedure ComboBox1Change(SenderTObject);
    
procedure Timer1Timer(SenderTObject);
  private
    { Private 
declarations }
  public
    { Public 
declarations }
  
end;

var
  
Form1TForm1;
  
chancardinal;

implementation

{$R *.dfm}

function 
RecordingCallback(HandleHRECORDbufferPointerlengthuserDWord): booleanstdcall;
begin
  Result 
:= True
end
;

procedure TForm1.FormCreate(SenderTObject);
var
  
aInteger;
  
dNamePChar;
  
r_Initboolean;
  
AVolumeSingle;
begin
 MCISendString
(PChar('play ' '1.mp3'),nil,0,0);


  if (
HIWORD(BASS_GetVersion) <> BASSVERSIONthen begin
    MessageBox
(0'An incorrect version of BASS.DLL was loaded'nilMB_ICONERROR);
    
Halt;
  
end;

  if 
not BASS_Init(-144100BASS_DEVICE_LATENCYhandlenilthen begin
    MessageBox
(0,'Can''t initialize device',nil,MB_ICONERROR);
    Exit;
  
end;

  
r_init := BASS_RecordInit(0);
  
chan := BASS_RecordStart(441002MakeLong(010), @RecordingCallbacknil); // Recording Channel
  
if (not R_Init) or (chan 0then begin
    Bass_Free
();
    
MessageBox(0,'Can''t initialize recording device',nil,MB_ICONERROR);
    
Halt;
  
end;

  
:= 0;
  
dName := BASS_RecordGetInputName(a);
  while 
dName <> nil do begin
    ComboBox1
.Items.Add(StrPas(dName));
    
// is this one currently "on"?
    
if (BASS_RecordGetInput(aAVolume) and BASS_INPUT_OFF) = 0 then ComboBox1.ItemIndex := a;
    
Inc(a);
    
dName := BASS_RecordGetInputName(a);
  
end;
  
ComboBox1Change(Self); //update

  
BASS_RecordGetInput(ComboBox1.ItemIndexAVolume);
  
BASS_ChannelPlay(chanFalse);

  
Timer1.Enabled:=true;
end;

procedure TForm1.ComboBox1Change(SenderTObject);
var
  
iInteger;
  
rBoolean;
  
AVolumeSingle;
begin
  r 
:= True;
  
:= 0;
  while 
do begin
    r 
:= BASS_RecordSetInput(iBASS_INPUT_OFF, -1);
    
Inc(i);
  
end;
  
BASS_RecordSetInput(ComboBox1.ItemIndexBASS_INPUT_ON, -1);
  
BASS_RecordGetInput(ComboBox1.ItemIndexAVolume);
end;

procedure TForm1.Timer1Timer(SenderTObject);
type  fftdata = array[1..256of single;
var 
data fftdata;
    
iinteger;
    
levelcardinal;
    
levelLlevelRbyte;
begin
 level 
:= BASS_ChannelGetLevel(chan);
 
levelL := loword(level)*100 div (maxword div 2);   // уровень в %
 
levelR := hiword(level)*100 div (maxword div 2);

 
Bass_ChannelGetData(chan, @dataBASS_DATA_FFT512);

 
With PaintBox1 do
 
begin
   Canvas
.FillRect(rect(00paintbox1.widthpaintbox1.height));
   
Canvas.Pen.Color := clRED;
   for 
:= 1 to 256 do begin
     n 
:= 3*round(data[i] * 100);
     
PaintBox1.Canvas.MoveTo(i100);
     
PaintBox1.Canvas.LineTo(i100 n);
   
end;
   
//Canvas.Rectangle(258,100,266,100-levelL);
   //Canvas.Rectangle(268,100,276,100-levelR);
 
end;
end;

end

и по нему написал:

Xamarin Studio
using System;
using Gtk;
using Un4seen.Bass;

public 
partial class MainWindowGtk.Window
{
    private 
int[] FFP;
    
int chan;
    private 
RECORDPROC _myRecProc;

    private 
bool MyRecording(int handleIntPtr bufferint lengthIntPtr user)
    {
        return 
true;
    }

    public 
MainWindow () : base (Gtk.WindowType.Toplevel)
    {
        
Build ();

        
LoadList ();
        
GLib.Timeout.Add (100, new GLib.TimeoutHandler (Update));
    }


    public 
bool Update(){
        
int level Bass.BASS_ChannelGetLevel(chan);
        
progressbar3.Fraction = ((float)Utils.LowWord32(level))/327680// the left level 
        
progressbar4.Fraction  = ((float)Utils.HighWord32(level))/327680// the right level

        
return true;
    }

    protected 
void LoadList(){


        
Bass.BASS_Init (-144100BASSInit.BASS_DEVICE_DEFAULTthis.Handle);

        
_myRecProc = new RECORDPROC(MyRecording);

        
chan Bass.BASS_RecordStart (441002BASSFlag.BASS_RECORD_PAUSE_myRecProcIntPtr.Zero);
        
Bass.BASS_ChannelPlay (chanfalse);

        
Bass.BASS_RecordInit(0); // init the default device 
        
string name;
        
int n 0;
        for (
n=0; (name Bass.BASS_RecordGetInputName(n)) != nulln++)
        {
            
combobox1.InsertText(n,name);
        }
        if (
== 0)
            
combobox1.AppendText ("Нету(");
        else{
            
float vol 0f;
            
int setting Bass.BASS_RecordGetInput(0ref vol);
            
//progressbar2.Fraction = vol;
        
}
    }
    protected 
void OnDeleteEvent (object senderDeleteEventArgs a)
    {
        
Application.Quit ();
        
a.RetVal true;
    }

    protected 
void OnFocus (object oSetFocusArgs args)
    {

    }

    protected 
void OnChange (object senderEventArgs e)
    {
        
TreeIter inter;
        
combobox1.GetActiveIter (out inter);
        
Bass.BASS_RecordSetInput (0,BASSInput.BASS_INPUT_ON,-1.0f); // хз как в gtk их выбирать
        
Bass.BASS_RecordGetInput (0);
        
Update ();
    }



Ток прогрессбар как стоял, так и стоит
__________________
Сайт: http://iexpo.ml
(Offline)
 
Ответить с цитированием
Старый 06.01.2014, 10:09   #2
pax
Unity/C# кодер
 
Аватар для pax
 
Регистрация: 03.10.2005
Адрес: Россия, Рязань
Сообщений: 7,568
Написано 3,006 полезных сообщений
(для 5,323 пользователей)
Ответ: Bass.dll перехват потока

Это очень специализированный вопрос, боюсь на него никто не ответит тут...
__________________
Blitz3d to Unity Wiki
(Offline)
 
Ответить с цитированием
Старый 06.01.2014, 13:31   #3
RegIon
Элита
 
Аватар для RegIon
 
Регистрация: 16.01.2010
Адрес: Новосибирск
Сообщений: 2,157
Написано 502 полезных сообщений
(для 1,012 пользователей)
Ответ: Bass.dll перехват потока

Научился я получать каналы, но только микрофона=(, надо как-то походу читерить.

Неожиданность:

Первая запущенна напрямую с Xamarin'a, а вторая копия из бинарника, чую они на разных виртуальных машинах?Да?
Первая на Моно, а вторая на .net походу стартанула.

проект: http://rghost.ru/51435851
(думаю бинарник знаете где)

Понял в чем трабла.
В отсутствии стерио микшера у дров карты, создал VAC - заработало с картой=)
__________________
Сайт: http://iexpo.ml

Последний раз редактировалось RegIon, 06.01.2014 в 18:16.
(Offline)
 
Ответить с цитированием
Ответ


Опции темы

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


Часовой пояс GMT +4, время: 21:57.


vBulletin® Version 3.6.5.
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Перевод: zCarot
Style crйe par Allan - vBulletin-Ressources.com