NESe (pronounced "Nessie") is a NES emulator based on the e6502 emulator, also written in C with a focus on speed and portability for use on embedded platforms, especially ARM.
25'ten fazla konu seçemezsiniz Konular bir harf veya rakamla başlamalı, kısa çizgiler ('-') içerebilir ve en fazla 35 karakter uzunluğunda olabilir.

61 satır
1.3KB

  1. #include <SDL2/SDL.h>
  2. #include "audio.h"
  3. typedef struct {
  4. SDL_AudioDeviceID id;
  5. } sdl_audio_device;
  6. static sdl_audio_device the_audio_device = {0};
  7. int sdl_audio_init(nes_Audio_Stream* stream, int frequency) {
  8. int status = SDL_Init(SDL_INIT_AUDIO);
  9. if (0 == status) {
  10. sdl_audio_device* device = &the_audio_device;
  11. SDL_AudioSpec as = {
  12. .freq = frequency,
  13. .format = AUDIO_S16SYS,
  14. .channels = 1,
  15. };
  16. device->id = SDL_OpenAudioDevice(NULL, 0, &as, NULL, 0);
  17. if (0 == device->id) {
  18. printf("SDL: %s\n", SDL_GetError());
  19. status = -1;
  20. } else {
  21. stream->data = device;
  22. SDL_PauseAudioDevice(device->id, 0);
  23. }
  24. }
  25. return status;
  26. }
  27. void sdl_audio_done(nes_Audio_Stream* stream) {
  28. if (stream->data) {
  29. SDL_CloseAudioDevice(
  30. ((sdl_audio_device*)stream->data)->id
  31. );
  32. stream->data = NULL;
  33. }
  34. }
  35. int sdl_audio_push(nes_Audio_Stream* stream,
  36. short* samples, int n_samples) {
  37. return SDL_QueueAudio(
  38. ((sdl_audio_device*)stream->data)->id,
  39. samples, n_samples * sizeof(short)
  40. );
  41. }
  42. nes_Audio_Stream sdl_audio = {
  43. .init = sdl_audio_init,
  44. .done = sdl_audio_done,
  45. .push = sdl_audio_push,
  46. };