MediaServer.pm
上传用户:market2
上传日期:2018-11-18
资源大小:18786k
文件大小:3k
源码类别:

外挂编程

开发平台:

Windows_Unix

  1. package mediaServer;
  2. use strict;
  3. use Base::Server;
  4. use base qw(Base::Server);
  5. use IPC::Messages qw(encode decode);
  6. use SDL;
  7. use SDL::Mixer;
  8. use SDL::Music;
  9. use SDL::Sound;
  10. # to install sdl_perl bindings in ActiveState Perl:
  11. # ppm install http://www.bribes.org/perl/ppm/SDL_Perl.ppd
  12. use constant ALERT => 0;
  13. use constant ALERT_MAX => 3;
  14. use constant SFX => 4;
  15. use constant SFX_MAX => 7;
  16. sub new {
  17. my ($class, $port, $host) = @_;
  18. my $self = $class->SUPER::new($port, $host);
  19. $self->{mixer} = new SDL::Mixer;
  20. return $self;
  21. }
  22. sub onClientNew {
  23. my ($self, $client) = @_;
  24. $client->{data} = '';
  25. }
  26. sub onClientData {
  27. my ($self, $client, $msg) = @_;
  28. my ($ID, %args, $rest);
  29. $client->{data} .= $msg;
  30. $ID = decode($client->{data}, %args, $rest);
  31. if (defined($ID)) {
  32. $self->process($client, $ID, %args);
  33. }
  34. }
  35. # internal
  36. sub process {
  37. my ($self, $client, $ID, $args) = @_;
  38. if ($ID eq 'mediaServer playfile') {
  39. my $file = $args->{file};
  40. my $domain = $args->{domain};
  41. my $loop = $args->{loop};
  42. my $volume = $args->{volume};
  43. if ($domain eq 'BGM') {
  44. $self->{mixer}->fade_out_music(1250);
  45. #while ($self->{mixer}->fading_music()) { }
  46. $self->{"BGM"} = new SDL::Music($file);
  47. $self->{mixer}->fade_in_music($self->{"BGM"}, ($loop - 1), 1250);
  48. } elsif ($domain eq 'ALERT') {
  49. my $channel = ALERT;
  50. while ($self->{mixer}->playing($channel)) {
  51. $channel++;
  52. if ($channel > ALERT_MAX) {
  53. print "Not enough channels!n";
  54. return;
  55. }
  56. }
  57. $self->{"ALERT $channel"} = new SDL::Sound($file);
  58. $self->{mixer}->play_channel($channel,$self->{"ALERT $channel"}, ($loop - 1));
  59. print "Playing $domain $filen";
  60. } elsif ($domain eq 'SFX') {
  61. my $channel = SFX;
  62. while ($self->{mixer}->playing($channel)) {
  63. $channel++;
  64. if ($channel > SFX_MAX) {
  65. print "Not enough channels!n";
  66. return;
  67. }
  68. }
  69. $self->{"SFX $channel"} = new SDL::Sound($file);
  70. $self->{mixer}->play_channel($channel,$self->{"SFX $channel"}, ($loop - 1));
  71. print "Playing $domain $filen";
  72. }
  73. } elsif ($ID eq 'mediaServer speak') {
  74. my $message = $args->{message};
  75. my $domain = $args->{domain};
  76. my $loop = $args->{loop};
  77. my $volume = $args->{volume};
  78. # TODO: speak now, or forever hold your peace
  79. } elsif ($ID eq 'mediaServer command') {
  80. my $command = $args->{command};
  81. my $which = $args->{which};
  82. if ($command eq 'stop') {
  83. if ($which eq 'BGM') {
  84. $self->{mixer}->fade_out_music(2000);
  85. } elsif ($which eq 'SFX') {
  86. for (my $channel = SFX; $channel < SFX_MAX; $channel++) {
  87. $self->{mixer}->halt_channel($channel);
  88. }
  89. } elsif ($which eq 'ALERT') {
  90. for (my $channel = ALERT; $channel < ALERT_MAX; $channel++) {
  91. $self->{mixer}->halt_channel($channel);
  92. }
  93. } elsif ($which eq 'ALL') {
  94. $self->{mixer}->fade_out_music(2000);
  95. for (my $channel = SFX; $channel < SFX_MAX; $channel++) {
  96. $self->{mixer}->halt_channel($channel);
  97. }
  98. for (my $channel = ALERT; $channel < ALERT_MAX; $channel++) {
  99. $self->{mixer}->halt_channel($channel);
  100. }
  101. }
  102. }
  103. } else {
  104. $client->close();
  105. }
  106. }
  107. sub iterate {
  108. my ($self) = @_;
  109. $self->SUPER::iterate();
  110. foreach my $key (%{$self}) {
  111. # TODO: remove unused hashes
  112. }
  113. }
  114. 1;