Войти
ПрограммированиеФорумОбщее

bass.dll звуковая библиотека - помогите разобраться.

#0
13:31, 18 ноя. 2010

с++ я начал изучать недавно.  Еще не во всем разобрался. Мне нужно разобраться с библиотекой bаss но хелп там никудышний, если кто знает где достать нормальный или работал с ней скиньте пожалуйста сюда ссылку или пример.


#1
14:13, 18 ноя. 2010

_@NEMO@_
Что ты именно не поймёшь? Там вполне нормальный Help.

#2
15:11, 18 ноя. 2010

Я с языками программирования недавно вплотную начал работать. Поэтому еще кое что недопонимаю, как в библиотеке музыку загрузить и чтоб она "запела"? :)  Скиньте хотя бы пример какой нибудь.

#3
15:17, 18 ноя. 2010

Вот тебе простой пример проигрывания WAV-файла (взято из архива с библиотекой):

/*
  BASS console WAV writer
  Copyright (c) 2002-2008 Un4seen Developments Ltd.
*/

#include <stdlib.h>
#include <stdio.h>
#include "bass.h"

#ifdef _WIN32 // Windows
#include <conio.h>
#else // OSX
#include <sys/types.h>
#include <sys/time.h>
#include <termios.h>
#include <string.h>

typedef struct {
  WORD wFormatTag;
  WORD nChannels;
  DWORD nSamplesPerSec;
  DWORD nAvgBytesPerSec;
  WORD nBlockAlign;
  WORD wBitsPerSample;
  WORD cbSize;
} WAVEFORMATEX;

int _kbhit()
{
  int r;
  fd_set rfds;
  struct timeval tv;
  struct termios term,oterm;
  tcgetattr(0,&oterm);
  memcpy(&term,&oterm,sizeof(term));
  cfmakeraw(&term);
  tcsetattr(0,TCSANOW,&term);
  FD_ZERO(&rfds);
  FD_SET(0,&rfds);
  tv.tv_sec=tv.tv_usec=0;
  r=select(1,&rfds,NULL,NULL,&tv);
  tcsetattr(0,TCSANOW,&oterm);
  return r;
}
#endif

#ifdef _BIG_ENDIAN
inline DWORD le_32(DWORD v)
{
  return (v>>24)|((v>>8)&0xff00)|((v&0xff00)<<8)|(v<<24);
}
inline WORD le_16(WORD v)
{
  return (v>>8)|(v<<8);
}
#else
#define le_32(v) (v)
#define le_16(v) (v)
#endif

// display error messages
void Error(const char *text) 
{
  printf("Error(%d): %s\n",BASS_ErrorGetCode(),text);
  BASS_Free();
  exit(0);
}

void main(int argc, char **argv)
{
  BASS_CHANNELINFO info;
  DWORD chan,p;
  QWORD pos;
  FILE *fp;
  short buf[10000];
  WAVEFORMATEX wf;

  printf("BASS WAV writer example : MOD/MPx/OGG -> BASS.WAV\n"
      "-------------------------------------------------\n");

  // check the correct BASS was loaded
  if (HIWORD(BASS_GetVersion())!=BASSVERSION) {
    printf("An incorrect version of BASS was loaded");
    return;
  }

  if (argc!=2) {
    printf("\tusage: writewav <file>\n");
    return;
  }

  // not playing anything, so don't need an update thread
  BASS_SetConfig(BASS_CONFIG_UPDATEPERIOD,0);

  // setup output - "no sound" device, 44100hz, stereo, 16 bits
  if (!BASS_Init(0,44100,0,0,NULL))
    Error("Can't initialize device");

  // try streaming the file/url
  if ((chan=BASS_StreamCreateFile(FALSE,argv[1],0,0,BASS_STREAM_DECODE))
    || (chan=BASS_StreamCreateURL(argv[1],0,BASS_STREAM_DECODE|BASS_STREAM_BLOCK,0,0))) {
    pos=BASS_ChannelGetLength(chan,BASS_POS_BYTE);
    if (pos==-1) // length not available
      printf("streaming file");
    else
#ifdef _WIN32
      printf("streaming file [%I64u bytes]",pos);
#else
      printf("streaming file [%llu bytes]",pos);
#endif
  } else {
    // try loading the MOD (with sensitive ramping, and calculate the duration)
    if (!(chan=BASS_MusicLoad(FALSE,argv[1],0,0,BASS_MUSIC_DECODE|BASS_MUSIC_RAMP|BASS_MUSIC_PRESCAN,0)))
      // not a MOD either
      Error("Can't play the file");
    { // count channels
      float dummy;
      for (p=0;BASS_ChannelGetAttribute(chan,BASS_ATTRIB_MUSIC_VOL_CHAN+p,&dummy);p++);
    }
    printf("MOD music \"%s\" [%u chans, %u orders]",
      BASS_ChannelGetTags(chan,BASS_TAG_MUSIC_NAME),p,BASS_ChannelGetLength(chan,BASS_POS_MUSIC_ORDER));
    pos=BASS_ChannelGetLength(chan,BASS_POS_BYTE);
  }

  // display the time length
  if (pos && pos!=-1) {
    p=(DWORD)BASS_ChannelBytes2Seconds(chan,pos);
    printf(" %u:%02u\n",p/60,p%60);
  } else // no time length available
    printf("\n");

  if (!(fp=fopen("BASS.WAV","wb"))) Error("Can't create file");
  printf("writing to BASS.WAV file... press a key to stop\n");
  // write WAV header
  BASS_ChannelGetInfo(chan,&info);
  wf.wFormatTag=1;
  wf.nChannels=info.chans;
  wf.wBitsPerSample=(info.flags&BASS_SAMPLE_8BITS?8:16);
  wf.nBlockAlign=wf.nChannels*wf.wBitsPerSample/8;
  wf.nSamplesPerSec=info.freq;
  wf.nAvgBytesPerSec=wf.nSamplesPerSec*wf.nBlockAlign;
#ifdef _BIG_ENDIAN // swap byte order
  wf.wFormatTag=le_16(wf.wFormatTag);
  wf.nChannels=le_16(wf.nChannels);
  wf.wBitsPerSample=le_16(wf.wBitsPerSample);
  wf.nBlockAlign=le_16(wf.nBlockAlign);
  wf.nSamplesPerSec=le_32(wf.nSamplesPerSec);
  wf.nAvgBytesPerSec=le_32(wf.nAvgBytesPerSec);
#endif
  fwrite("RIFF\0\0\0\0WAVEfmt \20\0\0\0",20,1,fp);
  fwrite(&wf,16,1,fp);
  fwrite("data\0\0\0\0",8,1,fp);

  while (!_kbhit() && BASS_ChannelIsActive(chan)) {
    int c=BASS_ChannelGetData(chan,buf,20000);
#ifdef _BIG_ENDIAN
    if (!(info.flags&BASS_SAMPLE_8BITS)) // swap 16-bit byte order
      for (p=0;p<c/2;p++) buf[p]=le_16(buf[p]);
#endif
    fwrite(buf,1,c,fp);
    pos=BASS_ChannelGetPosition(chan,BASS_POS_BYTE);
#ifdef _WIN32
    printf("pos %09I64u\r",pos);
#else
    printf("pos %09llu\r",pos);
#endif
    fflush(stdout);
  }
  // complete WAV header
  fflush(fp);
  p=ftell(fp);
  fseek(fp,4,SEEK_SET);
  putw(le_32(p-8),fp);
  fflush(fp);
  fseek(fp,40,SEEK_SET);
  putw(le_32(p-44),fp);
  fflush(fp);
  fclose(fp);

  BASS_Free();
}
#4
17:49, 18 ноя. 2010

Долго мучился, нифига не вышло. давайте сначала.

Попробуем со стороны с++, потому что в С я полный баран ):)

Вот пустое окно С++

Как и где и в какое место и что писать, чтоб при появлении окна на экране просто заиграл, скажем файл  file.mp3

P.S. Я использую Компилятор mingw32, он капризный, ругается по каждому пустяку.

#include <windows.h>

LRESULT CALLBACK WindowProcedure (HWND, UINT, WPARAM, LPARAM);


char szClassName[ ] = "WindowsApp";


int WINAPI
WinMain (HINSTANCE hThisInstance,
        HINSTANCE hPrevInstance,
        LPSTR lpszArgument,
        int nFunsterStil)

{
    HWND hwnd;           
    MSG messages;         
    WNDCLASSEX wincl;     

 
    wincl.hInstance = hThisInstance;
    wincl.lpszClassName = szClassName;
    wincl.lpfnWndProc = WindowProcedure;     
    wincl.style = CS_DBLCLKS;               
    wincl.cbSize = sizeof (WNDCLASSEX);

 
    wincl.hIcon = LoadIcon (NULL, IDI_APPLICATION);
    wincl.hIconSm = LoadIcon (NULL, IDI_APPLICATION);
    wincl.hCursor = LoadCursor (NULL, IDC_ARROW);
    wincl.lpszMenuName = NULL;             
    wincl.cbClsExtra = 0;                     
    wincl.cbWndExtra = 0;                     
   
    wincl.hbrBackground = (HBRUSH) COLOR_BACKGROUND;

 
    if (!RegisterClassEx (&wincl))
        return 0;

   
    hwnd = CreateWindowEx (
          0,                 
          szClassName,       
          "Windows App",     
          WS_OVERLAPPEDWINDOW,
          CW_USEDEFAULT,   
          CW_USEDEFAULT,     
          544,               
          375,               
          HWND_DESKTOP,       
          NULL,               
          hThisInstance,     
          NULL               
          );

 
    ShowWindow (hwnd, nFunsterStil);

 
    while (GetMessage (&messages, NULL, 0, 0))
    {
       
        TranslateMessage(&messages);
     
        DispatchMessage(&messages);
    }

 
    return messages.wParam;
}


LRESULT CALLBACK
WindowProcedure (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    switch (message)                 
    {
        case WM_DESTROY:
            PostQuitMessage (0);     
            break;
        default:                     
            return DefWindowProc (hwnd, message, wParam, lParam);
    }

    return 0;
}

#5
18:12, 18 ноя. 2010

_@NEMO@_
Если тебе нужно чтобы звук проигрывался после появления окна, то проигрывай его после команды:

ShowWindow (hwnd, nFunsterStil);

Собственно иди по порядку. Для начала просто инициализируй работу через функцию BASS_Init():

BOOL BASS_Init(
    int device,
    DWORD freq,
    DWORD flags,
    HWND win,
    GUID* clsid);

Собственно её описание есть в документации.

#6
20:33, 18 ноя. 2010

А дальше что?

#7
21:53, 18 ноя. 2010

>Вот пустое окно С++
Ржу-нимагу ))) Судя по всему, в С++ ты тоже полный баран, так что не переоценивай себя ))))

#8
22:17, 18 ноя. 2010

_@NEMO@_
А правда, зачем тебе BASS?! Возьми Шквал (тут). Там и дока хорошая (на русском).

#9
0:47, 19 ноя. 2010

НЕЕЕЕ Я в С++ не баран, а полубаран)))))) ------- 4 месяца назад осваивать начал, еще 4 месяца и будет готово  ;)
Кстати нашел я либрари хорошую для себя - Audiere называется. Простая как 2 пальца - в самый раз для начала))))
Отличный вариант, за пол часа свой проигрыватель, причем обалденный состряпать можно, много фишек есть да и совместимость полная
с моим компилятором.

#10
0:50, 19 ноя. 2010

Всем !!!!ОГРОМНОЕ СПАСИБО!!!! за советы.

#11
10:46, 19 ноя. 2010

slava_mib
> Ржу-нимагу ))) Судя по всему, в С++ ты тоже полный баран
Что ты такой резкий, как ...?

#12
12:44, 19 ноя. 2010

Audiere до невозможности хороша, жаль только её не саппортят ещё с 2006-го, помоему

ПрограммированиеФорумОбщее

Тема в архиве.