diff options
| -rw-r--r-- | README.md | 2 | ||||
| -rw-r--r-- | curses/Makefile.am | 4 | ||||
| -rw-r--r-- | curses/configure.ac | 3 | ||||
| -rw-r--r-- | curses/main.c | 49 | 
4 files changed, 31 insertions, 27 deletions
| @@ -20,7 +20,7 @@ PC-98用のFM音源ドライバエミュレーション(予定)  ## (まだ使えるような状況じゃないけど) 使い方  ### ncurses 版のデバッグ用 UI -ncurses, SDL2 を使用します。 +ncurses, portaudio を使用します。  ```  $ cd curses  $ autoreconf -i diff --git a/curses/Makefile.am b/curses/Makefile.am index 340f926..ef1a134 100644 --- a/curses/Makefile.am +++ b/curses/Makefile.am @@ -14,5 +14,5 @@ fmpc_SOURCES=main.c \               $(FMDRIVER_SOURCES)  fmpc_CFLAGS=-Wall -Wextra -pedantic \ -            -I.. $(SDL_CFLAGS) $(NCURSES_CFLAGS) -fmpc_LDADD=$(SDL_LIBS) $(NCURSES_LIBS) +            -I.. $(PORTAUDIO_CFLAGS) $(NCURSES_CFLAGS) +fmpc_LDADD=$(PORTAUDIO_LIBS) $(NCURSES_LIBS) diff --git a/curses/configure.ac b/curses/configure.ac index 704d32e..fd8e0cc 100644 --- a/curses/configure.ac +++ b/curses/configure.ac @@ -2,7 +2,8 @@ AC_INIT([fmplayer], [0.1.0])  AM_INIT_AUTOMAKE([-Wall -Werror foreign subdir-objects])  AC_PROG_CC_C99 -AM_PATH_SDL2([2.0.5]) +dnl AM_PATH_SDL2([2.0.5]) +PKG_CHECK_MODULES([PORTAUDIO], [portaudio-2.0])  PKG_CHECK_MODULES([NCURSES], [ncursesw >= 6])  AC_CONFIG_FILES([Makefile]) diff --git a/curses/main.c b/curses/main.c index cbde86a..1b97584 100644 --- a/curses/main.c +++ b/curses/main.c @@ -1,11 +1,12 @@  #include <curses.h>  #include <stdio.h> +#include <string.h>  #include <stdint.h>  #include "libopna/opna.h"  #include "libopna/opnatimer.h"  #include "fmdriver/fmdriver.h"  #include "fmdriver/fmdriver_fmp.h" -#include <SDL.h> +#include <portaudio.h>  #include <stdlib.h>  #include <locale.h>  #include <iconv.h> @@ -17,14 +18,18 @@ enum {    SRATE = 55467,  }; -static void sdl_callback(void *userdata, Uint8 *stream, int len) { -  SDL_memset(stream, 0, len); +static int pastream_cb(const void *inptr, void *outptr, unsigned long frames, +                       const PaStreamCallbackTimeInfo *timeinfo, +                       PaStreamCallbackFlags statusFlags, +                       void *userdata) {    struct opna_timer *timer = (struct opna_timer *)userdata; -  int16_t *buf = (int16_t *)stream; -  unsigned samples = len/2/2; -  opna_timer_mix(timer, buf, samples); +  int16_t *buf = (int16_t *)outptr; +  memset(outptr, 0, sizeof(int16_t)*frames*2); +  opna_timer_mix(timer, buf, frames); +  return paContinue;  } +  static void opna_writereg_libopna(struct fmdriver_work *work, unsigned addr, unsigned data) {    struct opna_timer *timer = (struct opna_timer *)work->opna;    opna_timer_writereg(timer, addr, data); @@ -394,8 +399,8 @@ err:  }  int main(int argc, char **argv) { -  if (SDL_Init(SDL_INIT_AUDIO) != 0) { -    fprintf(stderr, "cannot initialize SDL\n"); +  if (Pa_Initialize() != paNoError) { +    fprintf(stderr, "cannot initialize pulseaudio\n");      return 1;    }    if (argc != 2) { @@ -451,21 +456,15 @@ int main(int argc, char **argv) {    bool pvi_loaded = loadpvi(&work, &fmp, argv[1]);    bool ppz_loaded = loadppzpvi(&work, &fmp, argv[1]); -  SDL_AudioSpec as = {0}; -  as.freq = SRATE; -  as.format = AUDIO_S16SYS; -  as.channels = 2; -  as.callback = sdl_callback; -  as.userdata = &timer; -  as.samples = 2048; - -  SDL_AudioDeviceID ad = SDL_OpenAudioDevice(0, 0, &as, 0, 0); -  if (!ad) { +  PaError pe; +  PaStream *ps; +  pe = Pa_OpenDefaultStream(&ps, 0, 2, paInt16, SRATE, 0, +                            pastream_cb, &timer); +  if (pe != paNoError) {      fprintf(stderr, "cannot open audio device\n");      return 1;    } -  SDL_PauseAudioDevice(ad, 0); - +  Pa_StartStream(ps);    setlocale(LC_CTYPE, "");    initscr(); @@ -523,7 +522,7 @@ int main(int argc, char **argv) {    }    int cont = 1; -  int pause = 0; +  bool pause = 0;    while (cont) {      switch (getch()) {      case 'q': @@ -531,7 +530,11 @@ int main(int argc, char **argv) {        break;      case 'p':        pause = !pause; -      SDL_PauseAudioDevice(ad, pause); +      if (pause) { +        Pa_StopStream(ps); +      } else { +        Pa_StartStream(ps); +      }        break;      case ERR:        update(&ppz8, &opna, &fmp); @@ -540,7 +543,7 @@ int main(int argc, char **argv) {    }    endwin(); -  SDL_Quit(); +  Pa_Terminate();    return 0;  } | 
