windsp 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (8) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +2 -0
  3. data/Gemfile +3 -0
  4. data/README.md +58 -0
  5. data/Rakefile +2 -0
  6. data/lib/windsp.rb +98 -0
  7. data/windsp.gemspec +22 -0
  8. metadata +78 -0
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 9b40da30b2b860996cf31c7368ac836aa5456e56
4
+ data.tar.gz: b7da40fe4ffe89ba12110a9ec36da0dd4f5f7f54
5
+ SHA512:
6
+ metadata.gz: 877ad9b7b102de4f055b2105b6bdf407a0fbe572f3f7c0913ea85a5916941a32937e381fd36950b2c19ce8b5833e8e251db04605d83db7e968861b19f972a29d
7
+ data.tar.gz: 357b8e93fa930462ae7e9b040641b8c739fc948f666cf07663f2be73151aa50bac191708afc074871e4e95ba8ddc9779beaf751ec28fb81b5ac02685425cca21
data/.gitignore ADDED
@@ -0,0 +1,2 @@
1
+ pkg/*
2
+ Gemfile.lock
data/Gemfile ADDED
@@ -0,0 +1,3 @@
1
+ source 'https://rubygems.org'
2
+
3
+ gemspec
data/README.md ADDED
@@ -0,0 +1,58 @@
1
+ [![Version ](https://img.shields.io/gem/v/windsp.svg)](https://rubygems.org/gems/windsp)
2
+ WinDSP
3
+ ======
4
+
5
+ This software is published at https://github.com/unak/windsp .
6
+
7
+
8
+ What's This?
9
+ ------------
10
+
11
+ `/dev/dsp` emulator for Windows.
12
+
13
+
14
+ Requirement
15
+ -----------
16
+
17
+ Ruby 2.0.0 or later.
18
+
19
+ And, of cource, Windows :-)
20
+
21
+
22
+ How to Use
23
+ ----------
24
+
25
+ Simply require it.
26
+ After requiring, you can write PCM to pseudo I/O via `open "/dev/dsp"`.
27
+
28
+
29
+ Bug
30
+ ---
31
+
32
+ Flushing (= syncing) the sound makes noise sound.
33
+
34
+
35
+ License
36
+ -------
37
+
38
+ Copyright (c) 2015 NAKAMURA Usaku <usa@garbagecollect.jp>
39
+
40
+ Redistribution and use in source and binary forms, with or without
41
+ modification, are permitted provided that the following conditions are met:
42
+
43
+ 1. Redistributions of source code must retain the above copyright notice,
44
+ this list of conditions and the following disclaimer.
45
+ 2. Redistributions in binary form must reproduce the above copyright notice,
46
+ this list of conditions and the following disclaimer in the documentation
47
+ and/or other materials provided with the distribution.
48
+
49
+ THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND ANY
50
+ EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
51
+ WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
52
+ DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE FOR ANY
53
+ DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
54
+ (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
55
+ LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
56
+ ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
57
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
58
+ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
data/Rakefile ADDED
@@ -0,0 +1,2 @@
1
+ # -*- Ruby -*-
2
+ require "bundler/gem_tasks"
data/lib/windsp.rb ADDED
@@ -0,0 +1,98 @@
1
+ require 'fiddle/import'
2
+
3
+ class WinDSP
4
+ module WinMM
5
+ extend Fiddle::Importer
6
+ dlload "winmm.dll"
7
+ extern "int PlaySound(void *, void *, long)"
8
+
9
+ SND_SYNC = 0x0000
10
+ SND_ASYNC = 0x0001
11
+ SND_NODEFAULT = 0x0002
12
+ SND_MEMORY = 0x0004
13
+ SND_LOOP = 0x0008
14
+ SND_NOSTOP = 0x0010
15
+ SND_NOWAIT = 0x00002000
16
+ SND_ALIAS = 0x00010000
17
+ SND_ALIAS_ID = 0x00110000
18
+ SND_FILENAME = 0x00020000
19
+ SND_RESOURCE = 0x00040004
20
+ SND_PURGE = 0x0040
21
+ SND_APPLICATION = 0x0080
22
+ SND_SENTRY = 0x00080000
23
+ SND_RING = 0x00100000
24
+ SND_SYSTEM = 0x00200000
25
+
26
+ def self.make_wave(pcm)
27
+ head = ["WAVEfmt ", 16, 1, 1, 8000, 8000 * 1 * 1, 1 * 1, 8].pack('a*VvvVVvv')
28
+ data = ["data", pcm.bytesize, pcm].pack('a*Va*')
29
+ ["RIFF", head.bytesize + data.bytesize, head, data].pack('a*Va*a*')
30
+ end
31
+
32
+ def self.play_pcm(pcm, sync: true)
33
+ flags = SND_NODEFAULT | SND_MEMORY
34
+ flags |= SND_ASYNC unless sync
35
+ PlaySound(make_wave(pcm), nil, flags)
36
+ end
37
+ end
38
+
39
+ VERSION = "0.0.1"
40
+
41
+ def self.open(*rest, &block)
42
+ io = self.new(rest)
43
+ if block
44
+ begin
45
+ block.call(io)
46
+ ensure
47
+ io.close
48
+ end
49
+ else
50
+ io
51
+ end
52
+ end
53
+
54
+ def initialize(*rest)
55
+ @buf = ""
56
+ end
57
+
58
+ def close
59
+ flush
60
+ WinMM.PlaySound(nil, nil, 0)
61
+ end
62
+
63
+ def flush
64
+ if @buf.bytesize >= 0
65
+ until WinMM.play_pcm(@buf, sync: false)
66
+ sleep 0.1
67
+ end
68
+ end
69
+ @buf = ""
70
+ WinMM.play_pcm("", sync: true)
71
+ end
72
+
73
+ def write(str)
74
+ @buf << str
75
+ flush if @buf.bytesize > 8000 * 1 * 1 * 4
76
+ end
77
+
78
+ alias binwrite write
79
+ alias print write
80
+ alias syswrite write
81
+ alias << write
82
+ end
83
+
84
+ module Kernel
85
+ private
86
+ alias windsp_orig_open open
87
+ class << self
88
+ alias windsp_orig_open open
89
+ end
90
+ def open(name, *rest, &block)
91
+ if name == "/dev/dsp"
92
+ WinDSP.open(*rest, &block)
93
+ else
94
+ windsp_orig_open(name, *rest, &block)
95
+ end
96
+ end
97
+ module_function :open
98
+ end
data/windsp.gemspec ADDED
@@ -0,0 +1,22 @@
1
+ # coding: utf-8
2
+ # -*- Ruby -*-
3
+ require File.expand_path("lib/windsp")
4
+
5
+ Gem::Specification.new do |spec|
6
+ spec.name = "windsp"
7
+ spec.version = WinDSP::VERSION
8
+ spec.authors = ["U.Nakamura"]
9
+ spec.email = ["usa@garbagecollect.jp"]
10
+ spec.description = %q{`/dev/dsp` emulator for Windows}
11
+ spec.summary = %q{`/dev/dsp` emulator for Windows}
12
+ spec.homepage = "https://github.com/unak/windsp"
13
+ spec.license = "BSD-2-Clause"
14
+
15
+ spec.files = `git ls-files`.split($/)
16
+ spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
17
+ spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
18
+ spec.require_paths = ["lib"]
19
+
20
+ spec.add_development_dependency "bundler", "~> 1.3"
21
+ spec.add_development_dependency "rake"
22
+ end
metadata ADDED
@@ -0,0 +1,78 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: windsp
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ platform: ruby
6
+ authors:
7
+ - U.Nakamura
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2015-05-03 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: bundler
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '1.3'
20
+ type: :development
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '1.3'
27
+ - !ruby/object:Gem::Dependency
28
+ name: rake
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: '0'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ">="
39
+ - !ruby/object:Gem::Version
40
+ version: '0'
41
+ description: "`/dev/dsp` emulator for Windows"
42
+ email:
43
+ - usa@garbagecollect.jp
44
+ executables: []
45
+ extensions: []
46
+ extra_rdoc_files: []
47
+ files:
48
+ - ".gitignore"
49
+ - Gemfile
50
+ - README.md
51
+ - Rakefile
52
+ - lib/windsp.rb
53
+ - windsp.gemspec
54
+ homepage: https://github.com/unak/windsp
55
+ licenses:
56
+ - BSD-2-Clause
57
+ metadata: {}
58
+ post_install_message:
59
+ rdoc_options: []
60
+ require_paths:
61
+ - lib
62
+ required_ruby_version: !ruby/object:Gem::Requirement
63
+ requirements:
64
+ - - ">="
65
+ - !ruby/object:Gem::Version
66
+ version: '0'
67
+ required_rubygems_version: !ruby/object:Gem::Requirement
68
+ requirements:
69
+ - - ">="
70
+ - !ruby/object:Gem::Version
71
+ version: '0'
72
+ requirements: []
73
+ rubyforge_project:
74
+ rubygems_version: 2.4.5
75
+ signing_key:
76
+ specification_version: 4
77
+ summary: "`/dev/dsp` emulator for Windows"
78
+ test_files: []